Python / SWIG:输出数组
我试图从使用SWIG for Python包装的C函数输出值数组。我正在尝试使用以下类型映射。
伪代码:
int oldmain() {
float *output = {0,1};
return output;
}
类型图:
%typemap(out) float* {
int i;
$result = PyList_New($1_dim0);
for (i = 0; i < $1_dim0; i++) {
PyObject *o = PyFloat_FromDouble((double) $1[i]);
PyList_SetItem($result,i,o);
}
}
我的代码可以很好地编译,但是当我运行该函数时,它挂起了(没有更多调试方法)。
关于我要去哪里的任何建议?
谢谢。
-
这应该可以帮助您:
/* example.c */ float * oldmain() { static float output[] = {0.,1.}; return output; }
您将在此处返回一个指针,而swig不知道它的大小。普通的$ 1_dim0不起作用,因此您必须进行硬编码或做其他魔术。像这样:
/* example.i */ %module example %{ /* Put header files here or function declarations like below */ extern float * oldmain(); %} %typemap(out) float* oldmain { int i; //$1, $1_dim0, $1_dim1 $result = PyList_New(2); for (i = 0; i < 2; i++) { PyObject *o = PyFloat_FromDouble((double) $1[i]); PyList_SetItem($result,i,o); } } %include "example.c"
然后在python中,您应该获得:
>> import example >> example.oldmain() [0.0, 1.0]
添加类型映射时,您可能会发现
-debug-tmsearch
非常方便,即swig -python -debug-tmsearch example.i
在为寻找合适的“输出”型式时,应明确指出您的型式已被使用
float *oldmain
。另外,如果您只想访问c全局变量数组,则可以使用typemapvarout
代替来完成相同的技巧out
。