2016-01-18 3 views
0

Мой код выглядит следующим образом:в Tcl, как преобразовать список ARG в числовое значение

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" 

Как я могу преобразовать значение в списке, чтобы он отлично играл с операндом %?

ответ

4

Снимите брекеты вокруг $List_Of_Values_To_Sweep. Они предотвращают замену переменных, поэтому строка «$ List_Of_Values_To_Sweep» (с буквальным знаком доллара) присваивается i и используется в цикле, что означает, что аргумент decnum для decimalToBin также будет этой строкой вместо численного значения, которое вы намеревались. Двойная оценка внутри условия означает, что код пытается выполнить подстановку переменных в строке, но поскольку нет переменной с именем List_Of_Values_To_Sweep внутри decimalToBin, она не выполняется с сообщением об ошибке, которое вы указали.

Кроме того, условие if оценивается как если передается expr, так что вам не нужно вызывать expr внутри него:

if { $decNum % 2 > 0 } { 

Опять же, вы даже не нужно. Вы можете заменить всю конструкцию if с

set rd [expr {$decNum % 2}]$rd 

expr так, что вызов даст вам один или ноль, что вы хотите.

Смежные вопросы