在tcl中,如何将列表arg转换为数值

时间:2016-01-18 20:20:08

标签: string list tcl numerical

我的代码如下所示:

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"

如何转换列表中的值以使其与%操作数很好地匹配?

1 个答案:

答案 0 :(得分:4)

删除$List_Of_Values_To_Sweep周围的大括号。它们阻止变量替换,因此字符串“$ List_Of_Values_To_Sweep”(带有文字美元符号)被分配给i并在循环中使用,这意味着decnum的{​​{1}}参数将也是这个字符串而不是你想要的数值。条件内的双重评估意味着代码尝试对字符串执行变量替换,但由于decimalToBin内没有名为List_Of_Values_To_Sweep的变量,它会因您引用的错误消息而失败。

此外,decimalToBin条件的评估方式与传递给if一样,因此您无需在其中调用expr

expr

然后,你甚至不需要它。您可以使用

替换整个if { $decNum % 2 > 0 } { 构造
if

因为set rd [expr {$decNum % 2}]$rd 调用将为您提供所需的一个或零。