Как получить доступ к значению в сценарии tcl из файлов.cc

Я пытаюсь получить значение из.cc. В моем файле AgentCPU.h и AgentCPU.cc есть целое число "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);
...

и значение здесь верно, каждый раз, когда я получаю пакет, увеличивается "npkts". Есть ли какой-нибудь код неправильно? С другой стороны, я использую другой способ отладки. В моей функции "recv"

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

Таким образом, сообщение будет равно 1, и прекратите печатать. Может ли кто-нибудь дать мне руку? Как получить правильное значение из файла.cc? Любое предложение будет очень благодарным!

2 ответа

В Tcl каждая оценка скрипта дает значение результата (которое может быть пустым значением или может быть чем-то другим, в зависимости от того, что произошло). Это значение результата может быть извлечено из контекста интерпретатора с помощью Tcl_GetStringResult или Tcl_GetObjResult; первый создает (эффективно) const char * а второй - Tcl_Obj * (т.е. ссылку на значение Tcl, имя Tcl_Obj - по историческим причинам). Это значение существует до тех пор, пока не будет оценен следующий фрагмент сценария. Не изменяйте Tcl_Obj* (за исключением Tcl API), если вы точно не знаете, что делаете (т. Tcl_Obj* код для расширения самого Tcl). Целые числа могут быть эффективно извлечены из Tcl_Obj* используя Tcl_GetIntFromObj (при условии, что это целое число), числа с плавающей запятой с ********************, а const char * можно получить из Tcl_Obj* используя Tcl_GetString или Tcl_GetStringFromObj (несколько иной API).

В Tcl также имеются переменные. Вы можете прочитать их напрямую с помощью Tcl_GetVar который возвращает другой const char * - или Tcl_GetVar2Ex (с уродливым именем, но удобным API), который возвращает другой Tcl_Obj *.

Это все функции API C, и все они принимают Tcl_Interp * (что является ссылкой на контекст оценки Tcl, который всегда связан с одним потоком). Как они были обернуты в API C++... Я не могу вам этого сказать.


Вы используете какую-то странную библиотеку C++, о которой вы не сообщаете. Однако при использовании Tcl из программы C/C++, когда вы оцениваете некоторый код Tcl, результат доступен, прикрепленный к объекту интерпретатора. Вы получаете доступ к этому с помощью Tcl_GetObjResult, а затем используйте соответствующий Tcl_GetIntFromObj или ******************** или что угодно, чтобы прочитать значение Tcl_Obj в некоторой форме C++.

licensed under cc by-sa 3.0 with attribution.