使用SWIG的NumPy C扩展未知长度数组
我想用SWIG来封装一个C语言的函数。这个函数接收几个数组(长度相同)作为输入,并返回三个新的数组。不过,返回数组的长度是无法提前预测的,这些数组是在函数内部动态分配的。请问,使用SWIG(通过numpy.i)来封装这样的函数可行吗?如果可以的话,应该怎么做呢?
int func(double **a, double **b, long int *N, double *x, double *y, long int *Nx, long int *Ny);
在这里,Nx
和Ny
是事先已知的,但N
(也就是数组a
和b
的长度)是不确定的,而a
和b
是在函数内部用malloc
分配的。
1 个回答
1
看起来SWIG(或者其他任何Python包装生成器)都无法做到这一点。最后我还是手动写了Python的包装,这其实挺简单的,可以使用PyArray_SimpleNew
或者PyArray_SimpleNewFromData
来创建输出数组。使用后者的时候需要特别小心,以免造成内存泄漏。在尝试了一段时间后,我发现前者结合简单的memcpy
会更安全一些。