TCL无法读取变量:没有这样的变量(Tcl can't read variable: no

2019-10-18 02:50发布

在下面的代码段产生错误:

can't read "n": no such variable
    while executing
"$ns duplex-link $n$i $n([expr ($i+1)%120]) 1Mb 10ms DropTail"
    ("for" body line 2)
    invoked from within
"for {set i 7} {$i < 120} {incr i} {
      $ns duplex-link $n$i $n([expr ($i+1)%120]) 1Mb 10ms DropTail
}"
    (file "multicast.tcl" line 44)

似乎$ n $的我不评价的$所需的格式N7等在溶液中的任何帮助深表感谢。

for {set i 0} {$i < 120} {incr i} {
set n$i "[$ns node]"
global n$i
}

# Create links
$ns duplex-link $n0 $n1 1.5Mb 10ms DropTail
$ns duplex-link $n0 $n2 1.5Mb 10ms DropTail
$ns duplex-link $n2 $n3 1.5Mb 10ms DropTail
$ns duplex-link $n2 $n4 1.5Mb 10ms DropTail
$ns duplex-link $n1 $n7 1.5Mb 10ms DropTail
$ns duplex-link $n1 $n5 1.5Mb 10ms DropTail
$ns duplex-link $n4 $n6 1.5Mb 10ms DropTail

#create the rest of the links
for {set i 7} {$i < 120} {incr i} {
      $ns duplex-link $n$i $n([expr ($i+1)%120]) 1Mb 10ms DropTail
}

Answer 1:

TCL的$语法不分析非字母数字变量名(也有少数例外,我会来的那一刻),因此停止尝试解析的第一部分$n$in 。 这是解析器的限制,但它本身的Tcl允许几乎所有的东西。

其中一个例外是::命名空间的分隔符是允许过了,另一个原因是,你可以在把一个复杂的文字变量名{括号} ,像${n$i} 我们在这里不会有帮助的,虽然,因为你不能代替变量为变量名的方式。

你应该做的

使用数组。 形式$somename(stuff-to-do-an-index)允许全范围的换人stuff-to-do-an-index ,除了上几乎没有关系括号一些限制。

global ni;  # <-- you might not need this!
for {set i 0} {$i < 120} {incr i} {
    set ni($i) "[$ns node]"
}

# Create links
$ns duplex-link $ni(0) $ni(1) 1.5Mb 10ms DropTail
$ns duplex-link $ni(0) $ni(2) 1.5Mb 10ms DropTail
$ns duplex-link $ni(2) $ni(3) 1.5Mb 10ms DropTail
$ns duplex-link $ni(2) $ni(4) 1.5Mb 10ms DropTail
$ns duplex-link $ni(1) $ni(7) 1.5Mb 10ms DropTail
$ns duplex-link $ni(1) $ni(5) 1.5Mb 10ms DropTail
$ns duplex-link $ni(4) $ni(6) 1.5Mb 10ms DropTail

#create the rest of the links
for {set i 7} {$i < 120} {incr i} {
    $ns duplex-link $ni($i) $n([expr ($i+1)%120]) 1Mb 10ms DropTail
}

其他选择

您可以使用的一个参数版本set从变量读取(它的记录,但有点费解的新的Tcl)。

$ns duplex-link [set n$i] $n([expr ($i+1)%120]) 1Mb 10ms DropTail

您还可以使用upvar 0做出的别名变量然后你就可以正常操作:

upvar 0 n$i myAlias
$ns duplex-link $myAlias $n([expr ($i+1)%120]) 1Mb 10ms DropTail

更丑陋的是这种结构与subst

$ns duplex-link [subst "\$n$i"] $n([expr ($i+1)%120]) 1Mb 10ms DropTail

在此之后,它就会与真正讨厌evalreturn -level 0 (实际上是有效的:奇怪,但真)以及各种这样的东西,但真的不走那条路。 数组非常适合这样的事情,真的。



Answer 2:

为了清楚起见,我将介绍一些临时瓦尔:

for {set i 7} {$i < 120} {incr i} {
      set node1 n$i
      set node2 n[expr {($i + 1)%120}]
      $ns duplex-link [set $node1] [set $node2] 1Mb 10ms DropTail
}

集合的仅具有单个精氨酸(一个变种的名称)的调用返回的变量的值。

另外,您也可以使用subst命令:

for {set i 7} {$i < 120} {incr i} {
      set node1 n$i
      set node2 n[expr {($i + 1)%120}]
      $ns duplex-link [subst $$node1] [subst $$node2] 1Mb 10ms DropTail
}


文章来源: Tcl can't read variable: no such variable
标签: tcl ns2