在下面的代码段产生错误:
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
}
TCL的$
语法不分析非字母数字变量名(也有少数例外,我会来的那一刻),因此停止尝试解析的第一部分$n$i
后n
。 这是解析器的限制,但它本身的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
在此之后,它就会与真正讨厌eval
和return -level 0
(实际上是有效的:奇怪,但真)以及各种这样的东西,但真的不走那条路。 数组非常适合这样的事情,真的。
为了清楚起见,我将介绍一些临时瓦尔:
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
}