TCL和NS2“;调用类$cls:$args:$args时出错;

TCL和NS2“;调用类$cls:$args:$args时出错;,tcl,ns2,Tcl,Ns2,我已在线查看,但无法调试我的问题。 我正在运行一个tcl文件,它将产生以下错误,我已经硬编码了这些值,但仍然无法工作。为什么它不喜欢nametrace行 set val(rp) AODV ;# routing protocol set opt(x) 3500 set opt(y) 2000 set ns_ [new Simulator] set tracefd [open map.tr w] $ns_ t

我已在线查看,但无法调试我的问题。 我正在运行一个tcl文件,它将产生以下错误,我已经硬编码了这些值,但仍然无法工作。为什么它不喜欢nametrace行

set val(rp)     AODV                       ;# routing protocol
set opt(x)      3500
set opt(y)      2000


set ns_     [new Simulator]
set tracefd     [open map.tr w]
$ns_ trace-all $tracefd

set namf [open map.nam w]
$ns_ namtrace-allwireless $namf opt(x) opt(y) 
运行上面的代码会产生以下错误

(第1行)
从内部调用
“_o3cmd namtrace allwireless file4 3500 2000”
从内部调用
捕获“$self cmd$args”ret”
从内部调用
“如果[捕获“$self cmd$args”ret]{
设置cls[$self info class]
全局错误信息
设置savedInfo$errorInfo
错误“调用类$cls:$args时出错”$…“
(程序“_o3”第2行)
(拆分对象未知行2)
从内部调用
“$ns_uuNamTraceAllWireless$namf$opt(x)$opt(y)”
(文件“map.tcl”第45行)

是否有人知道抛出错误的原因以及我可以采取什么步骤来调试它。

您的报告巧妙地忽略了实际的错误消息,只给出了堆栈跟踪。不幸的是,对于oTcl(NS2使用的对象系统)堆栈跟踪信息不是很丰富;它只是告诉我们问题发生在
模拟器
类的
namtrace allwireless
方法的实现内部,或者可能是在尝试分派到实现时发生的。很难说是哪个。您需要修复错误报告。

C和C++错误报告

如果您已经在C或C++中编写了该方法的实现,最可能的问题是,在这种情况下,您没有将TCL解释器结果设置为返回“代码> TCLIORION<代码>的特定路径上的错误消息。标准TCL API辅助函数在检测到错误时都设置为上。(虽然在某些情况下,仅当通过

TCL_LEAVE_ERR_MSG
标志询问时;这适用于变量访问器)但对于您自己生成的错误,因为您检测到某些情况,您需要“手动”执行此操作通过调用
Tcl\u SetResult
Tcl\u SetObjResult
Tcl\u AppendResult

来自Tcl的错误报告 如果您已经在Tcl中编写了该方法的实现,那么问题可能是您已经使用默认的空结果完成了此操作:

return -code error
在末尾添加一条错误消息:

return -code error "something bad happened"
或者使用
error
命令强制您提供消息(不要使用空字符串)



问题的实际原因尚不清楚。我怀疑可能是在错误的堆栈上下文中解析了一个变量(在这种情况下,您没有要求代码为您生成错误)或者,在这种情况下,一旦修复了错误报告,它将变得显而易见。正确处理错误非常重要。

您的报告巧妙地忽略了实际的错误消息,只给出了堆栈跟踪。不幸的是,对于oTcl(NS2使用的对象系统)堆栈跟踪信息不是很丰富;它只是告诉我们问题发生在
模拟器
类的
namtrace allwireless
方法的实现内部,或者可能是在尝试分派到实现时发生的。很难说是哪个。您需要修复错误报告。

C和C++错误报告

如果您已经在C或C++中编写了该方法的实现,最可能的问题是,在这种情况下,您没有将TCL解释器结果设置为返回“代码> TCLIORION<代码>的特定路径上的错误消息。标准TCL API辅助函数在检测到错误时都设置为上。(虽然在某些情况下,仅当通过

TCL_LEAVE_ERR_MSG
标志询问时;这适用于变量访问器)但对于您自己生成的错误,因为您检测到某些情况,您需要“手动”执行此操作通过调用
Tcl\u SetResult
Tcl\u SetObjResult
Tcl\u AppendResult

来自Tcl的错误报告 如果您已经在Tcl中编写了该方法的实现,那么问题可能是您已经使用默认的空结果完成了此操作:

return -code error
在末尾添加一条错误消息:

return -code error "something bad happened"
或者使用
error
命令强制您提供消息(不要使用空字符串)


问题的实际原因尚不清楚。我怀疑这可能是因为在错误的堆栈上下文中解析了一个变量(并且在这种情况下,您没有要求代码为您生成错误),或者是因为在修复错误报告后,它会变得很明显。正确处理错误非常重要