2017-01-23 6 views
0

Я боюсь проблемы и по достоинству оценят вашу помощь.Как отправить команду tcl в интерпретатор tcl/tk из приложения C

Предположим, у меня есть приложение tcl/tk и интерпретатор «x.y.123.3454», и я хочу отправить некоторые процедуры tcl, которые определены в «x.y.123.3454», из приложения C.

Например, я хочу отправить puts "Hello World" из приложения C в 'x.y.123.3454'. Как это сделать?

Если вам интересно, почему я не выполняю эти процедуры & команд непосредственно в этом интерпретаторе tcl, сообщите мне.

+0

Если процессы TCL и C можно рассматривать и решать как независимые процессы, что любой стандартный механизм IPC может быть использован для передачи информации между ними. Содержимое из процесса «C» представляет собой текст, который может быть «оценен» из процесса TCL после получения, чтобы выполнить команду tcl. – Sharad

+0

Не могли бы вы уточнить? Все, что вы упомянули, желательно, но, как это сделать, это вопрос. –

ответ

0

Потратив много времени на эту проблему, я понял, что нет простого способа отправить команду tcl из C в уже существующее приложение tcl/tk или интерпретатор.

Следующая ссылка соглашается: http://cpptk.sourceforge.net/doc.html

1

На уровне C интерпретатор Tcl представлен дескриптором типа Tcl_Interp * (который следует обрабатывать так, как если бы он указывал на непрозрачную структуру). Это обычно называют именем interp людьми, работающими с Tcl API, но это не очень важно. После того, как у вас есть такая ручка, можно использовать:

int returnCode = Tcl_Eval(interp, "puts \"Hello World\""); 

запустить код (обратные косые черты там, потому что мы помещаем в двойные кавычки внутри строки С постоянной). Код возврата будет равен TCL_OK, если выполнение завершено успешно и будет равно TCL_ERROR, если что-то пошло не так. В случае OK вы получаете значение результата с Tcl_GetObjResult(interp) (и вы можете использовать Tcl_GetString, чтобы получить строчную версию результата для печати). В случае ошибки вы используете те же функции (то есть Tcl_GetObjResult, Tcl_GetString), чтобы получить сообщение об ошибке. Возможны другие коды возврата, но вы их обычно не увидите.

Конечно, результат puts - пустая строка успеха; сообщение распечатывается, а не возвращается.


Как вы можете получить эту интерпретатор-интерпретатор? Ну, это действительно зависит от того, как ваш код интегрируется с Tcl. Если вы пишете общую библиотеку, которая Tcl будет load, это единственный аргумент вашей функции инициализации. С другой стороны, если вы встраиваете Tcl, то вы, вероятно, в какой-то момент вызываете Tcl_CreateInterp(), который возвращает дескриптор новому создаваемому интерпретатору. Обычно это довольно очевидно, что вы делаете.

+0

Я знаю об этих двух вариантах. В C ему требуется Tcl_CreateInterp() и в tcl, 'load'. Но мой вопрос несколько отличается, у вас уже есть интерпретатор tcl с определенным именем приложения (в моем случае «x.y.123.3454»). Теперь как мне позвонить и отправить инструкции (команды tcl) на этот конкретный интерпретатор? –

+0

Я очень надеюсь, что вы заработаете. Мне очень нужен ваш совет. –

Смежные вопросы