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

how to access value in tcl script from .cc files

本文关键字:TCL 脚本 访问 cc 文件      更新时间:2023-10-16

我试图从。cc获得价值。在我的档案里,AgentCPU.h和AgentCPU.cc有一个名为"npkts_"的整数和一个用于接收数据包的函数"recv"当我终于完成了一个包,我将增加"npkts_"1进一步,在我的tcl脚本中,我想访问"npkts_"我的代码是这样的

set cpu [new AgentAgentCPU]
puts [format "%d" "$cpu set npkts_"]

但是,它们的值是不正确的当我像这样构造我的AgentCPU时,它的值是相同的

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

的值为199,在"recv"函数中,我使用"printf"来检查是否有问题

...
npkts_++;
printf("npkts is %dn",npkts);
...

和这里的值是正确的,每次我收到数据包将增加"npkts"有代码错误吗??另一方面,我使用另一种方式进行调试在我的"recv"函数

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

这样,消息将为1,并停止打印有人能帮我一下吗?如何从。cc文件中获得正确的值?任何建议都会非常感谢!!

在Tcl中,每个脚本求值都会产生一个结果值(它可以是空值,也可以是其他值,这取决于发生了什么)。结果值可以通过Tcl_GetStringResultTcl_GetObjResult从解释器上下文中检索;前者(有效地)产生一个const char *,后者产生一个Tcl_Obj *(即Tcl值参考);名称Tcl_Obj是由于历史原因)。该值一直存在,直到对下一段脚本进行评估。不要修改返回的Tcl_Obj*(通过Tcl的API除外),除非你确切地知道你在做什么(即,编写代码来扩展Tcl本身)。使用Tcl_GetIntFromObj可以有效地从Tcl_Obj*中检索整数(假设值是整数),使用Tcl_GetDoubleFromObj可以有效地检索浮点数,使用Tcl_GetStringTcl_GetStringFromObj可以从Tcl_Obj*中检索const char *(稍有不同的API)。

在Tcl中也有变量。你可以直接用Tcl_GetVar来读取它们——它返回另一个const char *——或者Tcl_GetVar2Ex(有一个丑陋的名字,但方便的API)返回另一个Tcl_Obj *


这些都是C API函数,并且都接受Tcl_Interp *(这是对Tcl计算上下文的引用,它总是绑定到单个线程)。我不能告诉你它们是如何被包装在c++ API中的

你正在使用一些奇怪的c++库,你没有给出任何信息。但是,当从C/c++程序中使用Tcl时,当您计算一些Tcl代码时,结果将附加到解释器对象中。您可以使用Tcl_GetObjResult访问它,然后使用适当的Tcl_GetIntFromObj或Tcl_GetDoubleFromObj或其他方法将Tcl_Obj值读取为某种c++形式。