如何在tcl表达式中使用全局字符串值

如何在tcl表达式中使用全局字符串值,tcl,Tcl,我正在使用Ns2和tcl脚本。在下面的代码中,我想使用全局变量rate12,它在表达式中的值为2Mb if { $queuesize>16 } { set RL [expr $Rc * $fdec * $hf] set rate12 [expr $rate12 * $RL] puts $rate12 } 从进程记录中找到。但它会显示以下错误: ns: record _o104 file5: invalid bareword "Mb" in expressio

我正在使用Ns2和tcl脚本。在下面的代码中,我想使用全局变量rate12,它在表达式中的值为2Mb

 if { $queuesize>16 } {
     set RL [expr $Rc * $fdec * $hf]
    set rate12 [expr $rate12 * $RL]
    puts $rate12
 }
从进程记录中找到。但它会显示以下错误:

ns: record _o104 file5: invalid bareword "Mb" in expression "4_@_Mb * 0.40000000000000002"; should be "$Mb" or "{Mb}" or "Mb(...)" or ... (parsing expression "4Mb * 0.40000000000000...") invoked from within "expr $rate12 * $RL" (procedure "record" line 26) invoked from within "record _o104 file5"
Tcl的
expr
命令不适用于附加了Mb等单位的值

因此它试图解释值
$rate12
,它是4Mb,但这不是一个有效的数字文字,因此您会得到错误。再加上你不支持你的表达,例如你写:

set rate12 [expr $rate12 * $RL]
而不是

set rate12 [expr {$rate12 * $RL}]
您会得到expr的双重评估,这会产生误导性的错误消息(并且可能会慢得多)


要解决这个问题,您需要对不带单位的值进行计算,或者编写一个小程序来处理包含单位的值。

Tcl的
expr
命令不适用于附加了单位Mb的值

因此它试图解释值
$rate12
,它是4Mb,但这不是一个有效的数字文字,因此您会得到错误。再加上你不支持你的表达,例如你写:

set rate12 [expr $rate12 * $RL]
而不是

set rate12 [expr {$rate12 * $RL}]
您会得到expr的双重评估,这会产生误导性的错误消息(并且可能会慢得多)


要解决这个问题,您需要对不带单位的值进行计算,或者编写一个小程序来使用包含的单位进行计算。

关键字
global
仅在
proc
的范围内有意义。要访问
rate12
,请在
过程记录的开头添加以下行:

global rate12
这会解决你的问题

使现代化

我的坏,在PROC的中间没有看到<代码> Global < /Cult>命令。问题是,一开始您就有:

set rate12 4Mb 
随后,在
过程记录中

set rate12 [expr $rate12 * $RL]
根据Tcl的说法,
4Mb
不是一个数字。我建议进行以下修复:

set rate12 4
或者,更具描述性:

set rateInMb12 4

关键字
global
仅在
proc
的范围内有意义。要访问
rate12
,请在
过程记录的开头添加以下行:

global rate12
这会解决你的问题

使现代化

我的坏,在PROC的中间没有看到<代码> Global < /Cult>命令。问题是,一开始您就有:

set rate12 4Mb 
随后,在
过程记录中

set rate12 [expr $rate12 * $RL]
根据Tcl的说法,
4Mb
不是一个数字。我建议进行以下修复:

set rate12 4
或者,更具描述性:

set rateInMb12 4

他有一个,大约在一半的时候。假设你在示例代码顶部看到的是一个错误的补丁应用于原始代码。他有一个,大约在一半的时候。假设你在示例代码顶部看到的是一个错误的补丁应用于原始代码