在 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。