小编Fab*_*ral的帖子

SWIG-将C字符串数组包装到python列表中

我想知道使用SWIG将C中的字符串数组包装到Python列表的正确方法是什么。

该数组在struct内部:

typedef struct {
   char** my_array;
   char* some_string; 
}Foo;
Run Code Online (Sandbox Code Playgroud)

SWIG自动将some_string包装为python字符串。

我应该在SWIG接口文件中放入什么,以便可以在Python中作为常规Python字符串列表['string1','string2'] 访问my_array

我已将typemap用作Sugested:

%typemap(python,out) char** {
  int len,i;
  len = 0;
  while ($1[len]) len++;
  $result = PyList_New(len);
  for (i = 0; i < len; i++) {
    PyList_SetItem($result,i,PyString_FromString($1[i]));
  }
}
Run Code Online (Sandbox Code Playgroud)

但这仍然行不通。在Python中,my_array变量显示为SwigPyObject:_20afba0100000000_p_p_char。

我想知道是否是因为char **在结构内部?也许我需要告知SWIG?

有任何想法吗?

c python swig

6
推荐指数
1
解决办法
3019
查看次数

SWIG-使用%newobject进行垃圾收集

在我的C代码中,我具有以下结构:

typedef struct my_structure{
    char* str1;
    char* str2;
}MyStruct;
Run Code Online (Sandbox Code Playgroud)

还有一个返回MyStruct指针的函数:

MyStruct* foo();
Run Code Online (Sandbox Code Playgroud)

在foo内部,我为MyStruct,str1和str2分配了内存,如下所示:

MyStruct* obj = malloc(sizeof(MyStruct));

obj.str1 = malloc(256);
obj.str2 = malloc(256);
Run Code Online (Sandbox Code Playgroud)

我想从python,java,C#和PHP调用foo,并且我不想在此过程中发生任何内存泄漏。

我不确定是否写:

%newobject foo;
MyStruct* foo();
Run Code Online (Sandbox Code Playgroud)

保证垃圾收集器将为结构和其中的字符串释放内存。

我不想让调用者有义务为str1和str2显式释放内存,因为我正在寻找一种自动释放内存的方法。这可能吗?

在这种情况下是否必须使用“ newfree”类型映射?

如果您能提供一个示例来说明实现此目标的最佳方法,将不胜感激。

谢谢!

c swig

5
推荐指数
1
解决办法
1715
查看次数

标签 统计

c ×2

swig ×2

python ×1