使用Swig将字符串列表从C函数发送到TCL进程

使用Swig将字符串列表从C函数发送到TCL进程,c,list,return,tcl,swig,C,List,Return,Tcl,Swig,我需要关于将字符串列表从C函数发送到TCL调用函数的指导。在swig的帮助下,我能够将C函数中的整型浮点值列表与函数返回值一起发送回TCL过程。但我无法将swig中的“test1”、“test2”等字符串列表连同返回值一起发送回TCL进程。任何关于这一点的指导/指针都会很好 工作的代码是这样的 intaddsub(inta、intb、int*result1、int*result2){ *结果1=a+b; *结果2=a-b; printf(“\n值为:%i,%i\n”,*result1,*resu

我需要关于将字符串列表从C函数发送到TCL调用函数的指导。在swig的帮助下,我能够将C函数中的整型浮点值列表与函数返回值一起发送回TCL过程。但我无法将swig中的“test1”、“test2”等字符串列表连同返回值一起发送回TCL进程。任何关于这一点的指导/指针都会很好

工作的代码是这样的

intaddsub(inta、intb、int*result1、int*result2){
*结果1=a+b;
*结果2=a-b;
printf(“\n值为:%i,%i\n”,*result1,*result2);
返回8;
}
Swig界面看起来像

%apply int*OUTPUT{int*result1,int*result2};
TCL呼叫就像

tclsh
%增补10 5
8 15 5.
它以列表的形式给出结果输出

但当我尝试在字符串中执行类似操作时,TCL中的返回列表只返回字符串中的第一个字符

代码不工作

int test\u str(char*out1,char*out2){
字符*str1,*str2;
str1=“Test1”;
str2=“Test2”;
strcpy(out1,str1);
strcpy(out2,str2);
printf(“输出1是%s\n”,输出1);
printf(“输出2是%s\n”,输出2);
返回100;
}
Swig接口文件看起来像

%apply int*OUTPUT{char*out1,char*out2};
TCL呼叫就像

Tclsh
%Teststr
出1是est2
输出2是测试2
100 101 84
它没有给出整个字符串。给出字符串中第一个字母的ASCII值

或者如果我的C函数是这样的

int test\u str(char*out1,char*out2){
字符*str1,*str2;
str1=“Test1”;
str2=“Test2”;
out1=str1;
out2=str2;
//strcpy(out1,str1);
//strcpy(out2,str2);
printf(“字符串1是%s\n”,str1);
printf(“字符串2是%s\n”,str2);
printf(“输出1是%s\n”,输出1);
printf(“输出2是%s\n”,输出2);
返回100;
}
Swig接口文件看起来像

%apply int*OUTPUT{char*out1,char*out2};
tclsh

%test\u str
字符串1是Test1
字符串2是Test2
Out 1是Test1
输出2是测试2
100 0 -127

有人能指出这里缺少什么吗。

这是一个非常棘手的案例。SWIG在处理用于输出的
char*
变量时存在特殊问题;缺少的信息太多,它无法自动找出需要执行的所有操作。(我认为默认情况下会将它们视为长度为1的字符数组,这没有多大帮助。)

您需要指定一个(以及在typemap中指定一个助手)来解决此问题:

// Allocate a (short) working buffer for the string; this is the part that
// SWIG *cannot* guess for you.
%typemap(in, numinputs=0) char *OUTPUT (char temp[50]) {
    $1 = &temp;
}
// Actually how to do the mapping of strings from a local buffer into Tcl values
%typemap(tcl,argout) char * {
    $result = Tcl_NewStringObj($1, -1);
}
然后,您必须应用
%apply
,才能实际获得正确值的缓冲区分配。(请注意,使用这种方法正确地进行缓冲区管理是相当棘手的,而且您正在使用的函数签名并不能很好地完成缓冲区管理。)



你的最后一个例子根本不起作用;您没有通过任何机制返回值(由于C字符串的工作方式;您只是在函数内部设置了一些内容,而不是告诉调用者)。除非您执行strcpy
strcpy

谢谢您的回复,否则不会实际复制字符串。你能告诉我怎么申请吗?所以你建议使用strcpy机制来申请。但是,如果您看到,当TCL打印时,第一个变量的第一个字符丢失了。当你说这是一个棘手的方法,这是任何其他的方式做这件事,因为我需要使用相同的机制多次从C函数中取出字符串,并在我的TCL中使用code@user我认为你做的
%apply
是正确的,尽管我并不确定。问题在于部分
char*
只是指向-
char
(字符串只是约定)的指针,部分原因是您不清楚代码中的调用约定实际上是什么。关键问题:缓冲区的大小是多少?谁分配缓冲区?你的被调用代码是如何知道这些东西的?这些东西是正确使用
%typemap
所必需的……我是Swig的初学者。我是TCL的家伙。我试图从C函数中发送两个字符串,即“Test1”和“Test2”到TCL,以及一个返回值,所有这些都应该作为列表返回到TCL。我的期望是,从C得到的TCL列表中,列表的第一个索引是C返回值,第二个和第三个元素是C函数发送的两个字符串。我使用了Swig教程中给出的%apply,它用于整数返回。我不确定这种做法是否正确。我根据Swig文档采用了这种方法。