1

我对 NS2 的使用非常天真,并试图在 NS2 中通过 UDP 实现 CBR。我写了以下代码:

set ns [new Simulator]
set tracefile [open out.tr w]
$ns trace-all $tracefile
set nf [open out.nam w]
$ns namtrace-all $nf

#should be "proc name args body"
#while executing
#"proc finish {}"

proc finish {}
{
global ns tracefile nf
    $ns flush-trace
    close $nf
    close $tracefile
    exec nam out.nam &
    exit 0
}
set n0 [$ns node]
set n1 [$ns node]
$ns simplex-link $n0 $n1 1Mb 10ms DropTail
set udp0 [new Agent/UDP]
$ns attach-agent $n0 $udp0
set cbr[new Application/Traffic/CBR]
$cbr attach-agent $udp0
set null0 [new Agent/Null]
$ns attach-agent $n1 $null0
$ns connect $udp0 $null0
$ns at 1.0 "$cbr start"
$ns at 3.0 "finish"
$ns run

显示的错误在 proc 完成过程上方进行了注释。我试图寻找错误,但找不到。我所做的就是将其编写为 Tcl 脚本并用于运行 ns filename.tcl 。

4

1 回答 1

6

Tcl作为一种语言将换行视为重要;它标志着形成命令调用的单词序列的结束。因为proc实际上只是一个普通的 Tcl 命令(碰巧使用脚本创建命令作为实现)而不是一些特殊的语法,如果你这样做:

proc finish {}

proc然后,根据其定义,您提供的参数比它需要的少一个。在那一点上,它会抱怨,而那个抱怨就是你所观察到的。(proc不知道您已决定在下一行放置一个您想用作脚本主体的词;这是 Tcl 作为政策明确回避的一种聪明程度,因为 Tcl 没有真正的特殊句法形式完全没有。)

解决这个问题的方法是使用“一个真正的大括号”样式编写代码,Tcl 强烈支持这种样式:

proc finish {} {
    # put the body in here
}

如果做不到这一点,你可以使用反斜杠来写不同的东西:

proc finish {} \
{
    # body...
}

然而,几乎没有任何 Tclers 似乎喜欢那个。(毕竟,它需要更多的打字。)

于 2013-05-12T15:38:45.027 回答