错误:对于TCL Ffile中的循环
我是ns2的新手。 在下面的代码中错误:对于TCL Ffile中的循环,tcl,Tcl,我是ns2的新手。 在下面的代码中 for {set i 0 }{$i < $val(nn)}{incr i } { set n$i [$ns node] $n$i set X_[expr 10+round(rand()*40)] } 对于{set i 0}{$i
for {set i 0 }{$i < $val(nn)}{incr i }
{
set n$i [$ns node]
$n$i set X_[expr 10+round(rand()*40)]
}
对于{set i 0}{$i<$val(nn)}{incr i}
{
设置n$i[$ns节点]
$n$i集合X_ur[expr 10+轮(rand()*40)]
}
我想创建50个节点,但在执行tcl文件时,在执行“$n$I set X_Ur[expr 10+round(rand()*40)]”时,错误显示为“无效的命令名”$n0”。我已将nn设置为50。tcl使用空格分隔的单词(请参见规则1,2,3),并且
命令的语法为
对于开始测试下一个车身
你需要这个:
for {set i 0} {$i < $val(nn)} {incr i} {
set n$i [$ns node]
[set n$i] set X_[expr {10+round(rand()*40)}]
}
对于{set i 0}{$i<$val(nn)}{incr i}{
设置n$i[$ns节点]
[set n$i]set X_u2;[expr{10+轮(rand()*40)}]
}
您发布的代码有两类问题
基本语法问题
请注意,我所做的所有修复工作都是围绕(和插入)空格移动
更深层次的语法问题
这些行有一个问题,您试图使用双重替换。嗯,有点。$
处理非常愚蠢,因为它检查非空的“nice”变量名之后,如果存在,则替换它,否则变为普通的旧$
。这意味着$n$i
是从$n
和$i
中获得的内容的串联
最简单的修复方法是使用另一个变量:
set thisnode [$ns node]
set n$i $thisnode
$thisnode set X_[expr 10+round(rand()*40)]
您甚至可以将前两行滚动为一行,因为set
的结果是刚刚设置的值:
set n$i [set thisnode [$ns node]]
$thisnode set X_[expr 10+round(rand()*40)]
但我们真的应该鼓励您使用数组来完成这类事情,因为它们确实允许排序的双重替换
set n($i) [$ns node]
$n($i) set X_[expr 10+round(rand()*40)]
那些额外的(
…)
产生了巨大的不同
您还可以使用列表存储生成的项目:
lappend n [$ns node]
[lindex $n end] set X_[expr 10+round(rand()*40)]
但在这种情况下,我真的很想使用helper变量:
lappend n [set thisnode [$ns node]]
$thisnode set X_[expr 10+round(rand()*40)]
其他事情
你也应该把你的表达式放在大括号里。在这种特殊情况下,这并不重要,因为它没有任何替换,但这是一个非常好的习惯,因为它使Tcl编译表达式变得非常容易;也就是说,当整个表达式是一个文本时,Tcl可以提前编译它,这就是它的速度很快,而当表达式是非文字的时候,它直到最后一刻才被编译,每次都要通过循环进行编译,并且可能会有一大堆其他的危险。如果你在数百万件事情上进行循环,而不是50件事,它会产生更大的差异
为清楚起见,将表达式分解为一个小过程可能是值得的:
proc random {from to} {
expr {$from + round(rand() * ($to-$from))}
}
编写一次(并调试!),然后在其他地方重用。这是懒惰的程序员的方式
我猜这也是一个NS2问题。在这种情况下,您可能仍然会遇到问题:X
和[expr…]
之间的下划线有点令人惊讶,除非您真的有大量非常相似的变量的对象要读取(然后丢弃一个随机的。那会…相当令人惊讶,是吗?我想你最好是:
for {set i 0} {$i < $val(nn)} {incr i} {
set n($i) [$ns node]
$n($i) set X [expr {10+round(rand()*40)}]
}
对于{set i 0}{$i<$val(nn)}{incr i}{
设置n($i)[$ns节点]
$n($i)集合X[expr{10+轮(rand()*40)}]
}
您需要保留参考资料吗?如果不需要,您甚至可以:
for {set i 0} {$i < $val(nn)} {incr i} {
[$ns node] set X [expr {10+round(rand()*40)}]
}
对于{set i 0}{$i<$val(nn)}{incr i}{
[$ns node]集合X[expr{10+轮(rand()*40)}]
}
但是,这可能不是您想要的;在实际代码中,您可能希望引用其他地方的节点,以便在它们之间添加链接…我看到3个错误:1.您应该将大括号与for放在同一行中。2.您必须在大括号之间添加空格{}
.3.$n$i
将被与i
值串联的n
的值替换。使用[set n$i]set X_u10;[expr 10+round(rand()*40)]
代替。或者数组。另一个可能的问题是$val(nn)
。这意味着“获取val
数组的nn
成员的值。如果在此之前使用过set val(nn)50
,则可以。如果您使用了设置nn 50
,并希望通过使用$val(nn)
获得该值,那么您就有麻烦了。在后一种情况下,您应该将比较写为$i<$nn
。给出的任何答案对您有帮助吗?在这种情况下,你应该接受这个答案,向浏览者表明这个答案是有效的。同样重要的是换行符(当不在大括号或双引号内,或前面有反斜杠时)是一个命令终止符。
proc random {from to} {
expr {$from + round(rand() * ($to-$from))}
}
$n($i) set X_[random 10 50]
for {set i 0} {$i < $val(nn)} {incr i} {
set n($i) [$ns node]
$n($i) set X [expr {10+round(rand()*40)}]
}
for {set i 0} {$i < $val(nn)} {incr i} {
[$ns node] set X [expr {10+round(rand()*40)}]
}