Восьмеричный выпуск
Трудно быть уверенным, но я подозреваю, что из-за проблемы с восьмеричным числом у вас есть код, который анализирует что-то вроде 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}"
Хорошо то, что это говорит вам, какая именно команда и где вызвали ошибку; это может иметь огромное значение в вашей детективной работе по поиску ваших проблем.
person
Donal Fellows
schedule
05.09.2018