Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有SWIG未知长度数组的NumPy C扩展_Python_C_Numpy_Swig - Fatal编程技术网

Python 具有SWIG未知长度数组的NumPy C扩展

Python 具有SWIG未知长度数组的NumPy C扩展,python,c,numpy,swig,Python,C,Numpy,Swig,我想用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

我想用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
)。

看来SWIG(或任何其他Python包装生成器)都无法做到这一点。 我最终手工编写了Python包装器,这实际上非常简单,使用
PyArray\u SimpleNew
PyArray\u SimpleNewFromData
创建输出数组。 对于后者,必须格外小心,以免产生内存泄漏。
在玩了一会儿之后,我发现前者与简单的
memcpy结合使用更安全。

这完全是一个C问题吗?SWIG使它更容易用<代码> STD::C++中的向量< /代码>,即使你结束了原来的函数。是的,它完全是一个C问题。我已经因为这个问题放弃了SWIG,并手动编写了包装器,效果很好。我可以发布答案,但它不是这个问题的真正答案,因为我不使用SWIG。没有理由因此放弃SWIG。只是不要使用SWIG的类型映射(它们非常复杂)。您可以根据需要编写自己的包装器,返回和接收PyObject*参数。SWIG将识别这些,同时仍然处理简单的案例(如int)。