从EDK 1.05移植到EDK2后看到八进制数字的TCL问题

时间:2018-09-05 08:52:14

标签: tcl octal uefi

我有一个使用EDK 1.05和TCL 8.3源的EFI Shell工具。该工具接受用户命令以显示PCI-E适配器信息并升级固件。我最近将其移植到UDK2017。我正在使用VS2012x86工具链来构建工具。

当我从EFI Shell运行二进制文件时,TCL报告此类错误。

can't use invalid octal number as operand of "||"
syntax error in expression "(1<<0)"
syntax error in expression "(0x1<<0)"

我已阅读有关TCL and Octal numbers的信息 由于在具有相同TCL版本的EDK 1.05代码中看不到此问题,因此我想知道是否有任何我遗漏的标志。我希望有一个简单的解决方案来克服此错误,因为TCL版本没有变化。

1 个答案:

答案 0 :(得分:2)

重要问题

很难确定,但是我怀疑八进制数字的问题是,您的代码将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}"

好处是,它可以告诉您确切的命令以及错误的出处;可以在侦探工作中找到巨大的差异,以找出问题所在。