为什么NS2的以下tcl脚本会给程序实现带来错误?

时间:2013-05-12 11:42:39

标签: tcl ns2

我非常天真地使用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来运行。

1 个答案:

答案 0 :(得分:6)

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

proc finish {}

然后,根据其定义,您为proc提供的参数少于其所需的参数。在这一点上,它抱怨,并且你的观察是抱怨。 (proc不知道你已经决定在下一行写下你想要用作脚本主体的单词;这是Tcl在政策问题上明确避开的一种聪明程度,因为Tcl有根本没有真正特殊的句法形式。)

解决此问题的方法是使用“one true brace” style编写代码,Tcl强烈支持:

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

如果失败了,你可以使用反斜杠来写不同的东西:

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

然而,几乎没有任何Tclers似乎赞成这一个。 (毕竟,它需要更多的输入。)