Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
错误:对于TCL Ffile中的循环_Tcl - Fatal编程技术网

错误:对于TCL Ffile中的循环

错误:对于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

我是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<$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)}]
}