tcl - 从 EDK 1.05 移植到 EDK2 后,TCL 出现八进制数问题
问题描述
我有一个使用 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 和八进制数的信息 由于使用相同 TCL 版本的 EDK 1.05 代码没有看到这个问题,我想知道是否有任何我遗漏的标志。我希望有一个简单的解决方案来克服这个错误,因为 TCL 版本没有变化。
解决方案
八进制问题
很难确定,但我怀疑八进制数问题的代码解析080808
为数字,由于前导0
(就像 C 或 C++ 中的常量)而被解释为八进制数,所以可以t 包含一个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 的版本,但是……</p>
$ 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}"
好消息是它可以准确地告诉你是什么命令以及在哪里给了你错误;这可以极大地改变您的侦探工作以追查您的问题。
推荐阅读
- c# - 我可以在 C# 中调用 Socket.BeginAccept 多少次
- javascript - React 拖放插件建议
- javascript - 如何删除 Google Drive Docs API 中的列表
- python - TokenAuthentication 对象没有属性“get_user”
- sql - 如何将 m 到 n 关系表中的行转换为新列?
- ios - UINavigationBar 外观 + iOS 13 深色模式 - 如何设置应用程序宽颜色?
- angular - 从联合类型接收单一类型的最佳实践是什么
- image - ASPX 图像未在 Firefox 上显示
- dialogflow-es - 在对话流中从 bot 发起消息
- php - 如何交换多维数组中的最大和最小数字?