我非常天真地使用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"
答案 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