如何修复TCL ns2中的错误

时间:2015-12-14 00:24:22

标签: tcl ns2

我非常天真地使用NS2,并试图在NS2和TCP上实现UDP上的CBR。

当我尝试编译它时,它给了我这个错误:

[a-zA-Z]

这是我的代码..我试图通过在互联网上查找来修复它,但我没有得到任何有用的信息

ns: _o28 start: 
    (_o28 cmd line 1)
    invoked from within
"_o28 cmd start"
    invoked from within
"catch "$self cmd $args" ret"



   invoked from within
"if [catch "$self cmd $args" ret] {
set cls [$self info class]
global errorInfo
set savedInfo $errorInfo
error "error when calling class $cls: $args" $..."
    (procedure "_o28" line 2)
    (SplitObject unknown line 2)
    invoked from within
"_o28 start"

2 个答案:

答案 0 :(得分:2)

NS2建立在用Tcl编写的对象系统之上,称为OTcl。现在这是一个相当古老的系统; Tcl中的其他人(完全使用对象系统)使用其他东西。其中一个原因是调试OTcl程序比大多数Tcl程序更加尴尬。

但这不涉及这个问题!如果我们查看堆栈跟踪,我们可以从启动它的调用中回过头来看看:

"_o28 start"

到弹出视图的地方:

    (_o28 cmd line 1)

唉,中间的一切只是OTcl机器。这是令我讨厌的,因为我注意到其中的一些不良做法,但它不应该关注你:它不在你的代码中,而是你正在使用的库。

不幸的是,无论创建错误的什么都没有给我们提供错误消息!这太可怕了。但是,我们可以从方法名称猜测它是这些调用它的行之一(延迟到模拟器引擎到达该时间戳):

$ns at 0.0 "$cbr start"
$ns at 0.2 "$tcp start"

这是什么? start类或Application/Traffic/CBR类的Agent/TCP方法?我真的不知道!堆栈跟踪整齐地省略了这一点。方法定义未在代码示例中显示,实际上可能在C或C ++中。我们根本没有这些信息。我们知道它看起来像是来自start方法体的第一行,但这就是所有。

由于您正在使用全局变量,您可以(可能)更改这两个回调设置行来执行此操作:

$ns at 0.0 {$cbr start}
$ns at 0.2 {$tcp start}

这推迟了变量的替换,直到调用时间,并且可能使您的堆栈跟踪信息足以确定哪个类的start方法有问题。它不会解决问题,但它可能让你更容易找到它。

通常,您的代码似乎合理Tcl。它正在使用NS2,所以它也使用OTcl(唉),但否则它不是问题。现代Tcl编程更喜欢使用list命令来构造回调而不是字符串替换,因此您可以这样做:

$ns at 0.0 [list $cbr start]
$ns at 0.2 [list $tcp start]

而不是:

$ns at 0.0 "$cbr start"
$ns at 0.2 "$tcp start"

但是对象名称很简单,这些是一次性回调,所以它对安全性或性能没有太大影响。

我不能告诉你是否正确使用NS2。我使用完全不同的库编写非常不同的Tcl程序。

答案 1 :(得分:0)

如果你注释掉这些" tcp"行,你的文件工作正常:

# $ns at 0.2 "$tcp start"
# $ns at 4 "$tcp stop"

对所有~2,000 ns2模拟文件运行搜索,表明从未使用"$tcp start"$ cd *All-examples/ && grep "tcp start" *,这可能意味着"$tcp start"不是有效的编码方式。< / p>

~2,000 ns2模拟文件:all_tcl-examples-2.tar.gz(41.8 MB) https://drive.google.com/file/d/0B7S255p3kFXNUUpUYWJ6TTdseWc/view?usp=sharing

查找tcp文件:$ cd *All-examples/ && ls | grep -i tcp