我试图从.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文件中获取正确的值? 任何建议都会非常感谢!!
答案 0 :(得分:1)
在Tcl中,每个脚本评估都会生成一个结果值(可能是空值,或者可能是其他内容,具体取决于发生的事情)。可以使用Tcl_GetStringResult
或Tcl_GetObjResult
从解释器上下文中检索该结果值;前者(有效地)生成const char *
而后者生成Tcl_Obj *
(即,Tcl值引用;名称Tcl_Obj
是出于历史原因)。在评估下一个脚本之前,该值就存在。不要修改返回的Tcl_Obj*
(除非通过Tcl的API),除非您确切知道自己在做什么(即,正在编写代码来扩展Tcl本身)。可以使用Tcl_Obj*
从Tcl_GetIntFromObj
有效地检索整数(假设值是整数),可以从中检索带Tcl_GetDoubleFromObj
的浮点数和const char *
。 Tcl_Obj*
使用Tcl_GetString
或Tcl_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 ++表单。