如何从.cc文件中访问tcl脚本中的值

时间:2014-05-10 09:45:38

标签: c++ tcl ns2

我试图从.cc获得价值。在我的档案中,  AgentCPU.h和AgentCPU.cc 有一个叫做#34; npkts _"的整数和一个功能" recv"用于接收数据包 当我最终完成一个包时,我会增加" npkts _" 1 另外,在我的tcl脚本中,我想访问" npkts _" 我的代码是这样的

set cpu [new Agent\AgentCPU]
puts [format "%d" "$cpu set npkts_"]

然而,其他值并不正确 它与我构建我的AgentCPU时的值相同

AgentCPU::AgentCPU(): Agent(PT_TASK)
{
...
npkts_=199;
...}

值为199, 并且在" recv"功能,我用" printf"检查是否有任何问题

...
npkts_++;
printf("npkts is %d\n",npkts);
...

这里的值是正确的,每次收到Packet都会增加" npkts" 有没有代码错了? 另一方面,我使用另一种方式进行调试 在我的" recv"功能

...
npkts_++;
Tcl& tcl = Tcl:;instance();
tcl.evalf("puts \" npkts is %d""",npkts_);
..

这样消息将为1,并停止打印 sombody可以帮个忙吗? 如何从.cc文件中获取正确的值? 任何建议都会非常感谢!!

2 个答案:

答案 0 :(得分:1)

在Tcl中,每个脚本评估都会生成一个结果值(可能是空值,或者可能是其他内容,具体取决于发生的事情)。可以使用Tcl_GetStringResultTcl_GetObjResult从解释器上下文中检索该结果值;前者(有效地)生成const char *而后者生成Tcl_Obj *(即,Tcl值引用;名称Tcl_Obj是出于历史原因)。在评估下一个脚本之前,该值就存在。不要修改返回的Tcl_Obj*(除非通过Tcl的API),除非您确切知道自己在做什么(即,正在编写代码来扩展Tcl本身)。可以使用Tcl_Obj*Tcl_GetIntFromObj有效地检索整数(假设值是整数),可以从中检索带Tcl_GetDoubleFromObj的浮点数和const char *Tcl_Obj*使用Tcl_GetStringTcl_GetStringFromObj(略有不同的API)。

Tcl中也有变量。您可以使用Tcl_GetVar直接阅读这些内容,这会返回另一个const char * - 或Tcl_GetVar2Ex(名称丑陋,但方便的API),返回另一个Tcl_Obj *


这些都是C API函数,并且都采用Tcl_Interp *(这是对Tcl评估上下文的引用,始终绑定到单个线程)。它们是如何被C ++ API包装的......我无法告诉你。

答案 1 :(得分:0)

您正在使用一些奇怪的C ++库,但您没有提供任何相关信息。但是,在评估某些Tcl代码时使用C / C ++程序中的Tcl时,结果可以附加到解释器对象。您可以使用Tcl_GetObjResult访问它,然后使用适当的Tcl_GetIntFromObj或Tcl_GetDoubleFromObj或其他任何内容将Tcl_Obj值读入某些C ++表单。