Восьмой выпуск
Трудно быть уверенным, но я подозреваю, что с проблемой восьмеричного числа у вас есть код, который разбирает что-то вроде 080808
как число, которое интерпретируется как восьмеричное из-за ведущего 0
(как константа) в C или C ++) и поэтому не может содержать 8
(или 9
). Чтобы разобрать число определенно как десятичное, используется команда scan
:
set val 080808
scan $val "%d" parsedVal
# Properly, should check that [scan] has a result of 1, but I probably wouldn't bother
puts "$val -> $parsedVal"
Синтаксическая ошибка нечетного выражения
Другие syntax error in expression "(1<<0)"
ошибки более странные, так как это определенно допустимый синтаксис. У меня есть только версии до 8.4 на этой машине, но…
$ tclsh8.4
% expr (1<<0)
1
Единственным способом, которым может быть недопустимое выражение, является то, что оно написано на каком-либо пользовательском языке выражений (который будет зависеть от приложения; вам нужно будет прочитать документацию, чтобы это выяснить) или если вы используете Строка выражения в виде числового значения:
% set val (1<<0)
(1<<0)
% expr {$val + 1}
can't use non-numeric string as operand of "+"
но это не произвело бы именно ту ошибку, которую вы видите. Действительно очень загадочно!
Использовать трассировки стека
Есть кое-что, что может помочь вам понять, что происходит. После ошибки глобальная переменная errorInfo
генерирует трассировку стека. Например, после вышеприведенной ошибки expr
он имеет следующее:
% puts $errorInfo
can't use non-numeric string as operand of "+"
while executing
"expr {$val + 1}"
Хорошо, что это точно говорит вам, какая команда и где дала ошибку; это может иметь огромное значение в вашей работе детектива, чтобы выследить ваши проблемы.