从EDK 1.05移植到EDK2后,TCL发现了八进制数

问题描述 投票:0回答:1

我有一个使用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的内容因为EDK 1.05代码没有使用相同的TCL版本,所以我想知道是否有任何我错过的标志。我希望有一个简单的解决方案来解决这个错误,因为TCL版本没有变化。

tcl octal uefi
1个回答
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}"

好消息是,这可以告诉您究竟是什么命令以及在哪里给出了错误;这可以使你的侦探工作有巨大的差异来追捕你的问题。

© www.soinside.com 2019 - 2024. All rights reserved.