在 TCL 中,如何将列表参数转换为数值
in tcl, how to convert a list arg into a numerical value
我的代码如下所示:
proc decimalToBin { decNum numBits } {
set one "1"
set zero "0"
set rd ""
for { set jj 0 } { $jj < $numBits } { incr jj } {
if { [expr {$decNum % 2}] > 0 } {
set rd "$one$rd"
} else {
set rd "$zero$rd"
}
set decNum [expr $decNum / 2]
}
return $rd
}
set List_Of_Values_To_Sweep {0 1 63 255}
foreach i {$List_Of_Values_To_Sweep} {
set temp [decimalToBin $i 8]
}
我收到如下所示的错误:
ncsim: *E,TCLERR: can't read "List_Of_Values_To_Sweep": no such
variable.
while executing "expr $decNum % 2"
如何转换列表中的值,使其与 %
操作数配合得很好?
去掉 $List_Of_Values_To_Sweep
周围的大括号。它们防止变量替换,因此字符串“$List_Of_Values_To_Sweep”(带有文字美元符号)被分配给 i
并在循环中使用,这意味着 decnum
参数 decimalToBin
也将是这个字符串,而不是您想要的数值。条件内的双重评估意味着代码尝试对字符串执行变量替换,但由于 decimalToBin
内没有名为 List_Of_Values_To_Sweep
的变量,它失败并显示您引用的错误消息。
此外,if
条件的计算就像传递给 expr
一样,因此您不需要在其中调用 expr
:
if { $decNum % 2 > 0 } {
话又说回来,你甚至不需要它。您可以将整个 if
结构替换为
set rd [expr {$decNum % 2}]$rd
因为 expr
调用会给你想要的 1 或 0。
我的代码如下所示:
proc decimalToBin { decNum numBits } {
set one "1"
set zero "0"
set rd ""
for { set jj 0 } { $jj < $numBits } { incr jj } {
if { [expr {$decNum % 2}] > 0 } {
set rd "$one$rd"
} else {
set rd "$zero$rd"
}
set decNum [expr $decNum / 2]
}
return $rd
}
set List_Of_Values_To_Sweep {0 1 63 255}
foreach i {$List_Of_Values_To_Sweep} {
set temp [decimalToBin $i 8]
}
我收到如下所示的错误:
ncsim: *E,TCLERR: can't read "List_Of_Values_To_Sweep": no such
variable.
while executing "expr $decNum % 2"
如何转换列表中的值,使其与 %
操作数配合得很好?
去掉 $List_Of_Values_To_Sweep
周围的大括号。它们防止变量替换,因此字符串“$List_Of_Values_To_Sweep”(带有文字美元符号)被分配给 i
并在循环中使用,这意味着 decnum
参数 decimalToBin
也将是这个字符串,而不是您想要的数值。条件内的双重评估意味着代码尝试对字符串执行变量替换,但由于 decimalToBin
内没有名为 List_Of_Values_To_Sweep
的变量,它失败并显示您引用的错误消息。
此外,if
条件的计算就像传递给 expr
一样,因此您不需要在其中调用 expr
:
if { $decNum % 2 > 0 } {
话又说回来,你甚至不需要它。您可以将整个 if
结构替换为
set rd [expr {$decNum % 2}]$rd
因为 expr
调用会给你想要的 1 或 0。