gpt4 book ai didi

c - 在 C 程序中重复使用 TCL 解释器

转载 作者:行者123 更新时间:2023-11-30 16:20:38 24 4
gpt4 key购买 nike

我希望使用一个c程序多次重复运行TCL解释器。由于复杂的原因,我需要它是一个纯 C 程序,而不是作为共享对象嵌入的东西。作为示例,我希望运行这个简单的 tcl 程序 tryMe.tcl 两次:

prtstr "Test from tryMe.tcl"

prtstr 是我编写的 TCL 函数,目前仅写入标准输出。下面是尝试解释 tryMe.tcl 程序两次的 C 代码。

我在linux下编译如下程序:

$ gcc -c try.c; gcc -o try try.o -ltcl; 

然后像这样运行:

$ ./try tryMe.tcl

我的输出为零。我究竟做错了什么?还需要执行哪些步骤来重置 tcl 解释器,以便每次都是新鲜的。

#define _GNU_SOURCE
#include <tcl/tcl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int PrintStrObjCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])
{
char *str;
int len;
Tcl_Obj *objPtr;
int i;
if (objc != 2) {
Tcl_WrongNumArgs(interp, 1, objv, "value");
return TCL_ERROR;
}
objPtr = objv[1];

str = Tcl_GetStringFromObj(objPtr, &len);
if (str[0] == '\0')
return TCL_ERROR;

printf("len: %d, str: %s\n", len, str);
return TCL_OK;
}

int Tcl_AppInit(Tcl_Interp* interp)
{
if (Tcl_Init(interp) == TCL_ERROR)
return TCL_ERROR;
Tcl_CreateObjCommand(interp,"prtstr", PrintStrObjCmd, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
return TCL_OK;
}

int main(int argc, char *argv[])
{
char *cmd = NULL;
Tcl_Interp * interp = Tcl_CreateInterp();

Tcl_AppInit(interp);

asprintf(&cmd, "%s -x -y -z", argv[1]);
Tcl_Eval(interp, cmd);
free(cmd);
asprintf(&cmd, "%s -q -r -s 2", argv[1]);
Tcl_Eval(interp, cmd);
exit(0);
}

非常感谢!

最佳答案

您应该查看the Tcler's Wiki on this ,因为在应用程序中嵌入 Tcl 解释器的模式是已知且受支持的模式。它包括一个您可以改编的工作示例(不,我没有编写它;我更喜欢扩展标准 Tcl 解释器)。

您遇到的主要问题是您没有调用Tcl_FindExecutable()。在现代 Tcl 中,这会初始化库中的许多关键子系统(包括其高性能内存分配器!),因此它有点重要。在您的情况下,您有一个真正的 argv 可用,因此您可以将 argv[0] 与它一起使用:

Tcl_FindExecutable(argv[0]);
// NULL would also work as an argument, in a pinch at least

完成此操作后,您可以调用其他 Tcl API 函数,特别是 Tcl_CreateInterp()

您有一个小问题,因为您没有测试失败调用的结果。在 C 中,这是必不可少的,因为您没有异常(exception)来为您执行繁重的错误处理工作。

关于c - 在 C 程序中重复使用 TCL 解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55230757/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com