在 NS2 中,有没有办法将 C++ 变量嵌入到 TCL 脚本中?比如在TCL中,这样设置路由协议,set opt(rt) XXX
XXX
可以是C++程序中定义的变量,比如
if(CONDITION==1)
XXX = "FLOODING";
if(CONDITION==2)
XXX = "AODV";
...
最简单的方法是使用Tcl_LinkVar
将 C++ 中的 char* 变量(不支持 std::string)耦合到 Tcl。像这样,您所要做的就是更改 C++ 变量并调用Tcl_UpdateLinkedVar
以允许 Tcl 注意到该变量已更改。如果您从未在变量上设置任何跟踪,则不需要使用Tcl_UpdateLinkedVar
,但它们实际上是一种非常常见的机制,因此建议进行调用。请注意,这Tcl_UpdateLinkedVar
是对 Tcl 解释器的可重入调用;应注意确保您运行的任何跟踪都不会触发循环回您的代码……</p>
// Setup (done once)...
Tcl_LinkVar(interp, "XXX", &XXX, TCL_LINK_STRING|TCL_LINK_READ_ONLY);
// Your code ...
if(CONDITION==1)
XXX = "FLOODING";
if(CONDITION==2)
XXX = "AODV";
// Notify Tcl ...
Tcl_UpdateLinkedVar(interp, "XXX");
如果您希望 Tcl 变量的设置XXX
更改 C++ 变量XXX
,则需要格外小心。放弃使用 TCL_LINK_READ_ONLY并确保您始终使用它ckalloc
来为 in 中的字符串分配内存XXX
(因为在设置 C++ 变量时,Tcl 将使用匹配ckfree
的来处理旧的)。