0

我需要有关将字符串列表从 C 函数发送到 TCL 调用函数的指导。在 swig 的帮助下,我能够将整数、浮点值列表从 C 函数发送回 TCL 过程以及函数返回值。但是我无法将诸如“test1”、“test2”之类的字符串列表从 swig 连同返回值一起发送回 TCL procs。任何对此的指导/指针都会很棒。

那个正在工作的代码是这样的

int addsub (int a, int b, int *result1, int *result2) {
  *result1 = a + b;
  *result2 = a - b;
  printf("\n The value is: %i, %i  \n",*result1, *result2);
  return 8;
}

Swig 界面看起来像

%apply int *OUTPUT {int *result1, int *result2};

TCL Calling 就像

tclsh
% Addsub 10 5

8 15 5.

它将结果输出作为列表

但是当我尝试在字符串中做类似的事情时,TCL 中的返回列表只返回字符串中的第一个字符

代码不工作

int test_str (char *out1, char *out2) {
  char *str1, *str2;
  str1 = "Test1";
  str2 = "Test2";
  strcpy (out1,str1);
  strcpy (out2,str2);
  printf ("Out 1 is %s\n", out1);
  printf ("Out 2 is %s\n", out2);
  return 100;
}

Swig 接口文件看起来像

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

TCL Calling 就像

Tclsh

% Teststr

Out 1 is est2
Out 2 is Test2
100 101 84

它没有给出整个字符串。给出字符串中第一个字母的 ASCII 值。

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

int test_str (char *out1, char *out2) {
  char *str1,*str2;
  str1 ="Test1";
  str2 = "Test2";
  out1=str1;
  out2=str2;
  //strcpy (out1,str1);
  //strcpy (out2,str2);
  printf ("String 1 is %s\n", str1);
  printf ("String 2 is %s\n", str2);
  printf ("Out 1 is %s\n", out1);
  printf ("Out 2 is %s\n", out2);
  return 100;
}

Swig 接口文件看起来像

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

tclsh

% test_str

String 1 is Test1
String 2 is Test2
Out 1 is Test1
Out 2 is Test2
100 0 -127

有人可以指出这里缺少什么。

4

1 回答 1

2

这是一个非常棘手的案例。SWIG 在处理char *用于输出的变量时存在特殊问题;它缺少太多信息,无法自动计算出它需要做的所有事情。(我认为它最终默认将它们视为长度为 1 的字符数组,这不是很有帮助。)

您需要指定一个argout类型映射(和一个辅助in类型映射)来解决此问题:

// 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……</p>

于 2013-03-14T05:50:19.433 回答