使用SWIG包装带有复杂数组(指针)作为参数的C函数?

时间:2018-12-28 03:09:26

标签: c python-3.x numpy swig

我想使用SWIG包装我创建的C库,以便可以将其与Python(NumPy)一起使用。一些函数就地更改了一个复杂的数组(使用指针)。我不能和他们一起包纸。

我创建了一个测试标头test.h

#include <complex.h>

int matrix(double* z1, int n1); //this works normally

int cmatrix(_Complex double* z2, int n2);

实现为test.c

#include <test.h>

int matrix(double* z1, int n1)
{
    if (n1 < 0) n1 = -n1;
    for (int i = 0; i < n1; i++)
    {
        z1[i] = i;
    }
    return 0;
}

int cmatrix(_Complex double* z2, int n2)
{
    if (n2 < 0) n2 = -n2;
    for (int i = 0; i < n2; i++)
    {
        z2[i] = i;
    }
    return 0;
}

此测试库包装在test.i

%module test

%{
#define SWIG_FILE_WITH_INIT
#include <complex.h>
#include "test.h"
%}

#define _Complex complex

%include <complex.i>
%include "numpy.i"

%init %{
import_array();
%}

%apply (double* INPLACE_ARRAY1, int DIM1) {(double* z1, int n1)}
%apply (_Complex double* INPLACE_ARRAY1, int DIM1) {(_Complex double* z2, int n2)}

%include "test.h"

我用哪个编译的

swig -python test.i
gcc -O2 -fPIC -c test.c
gcc -O2 -fPIC -c test_wrap.c -I$(PYTHONDIR) -I$(NUMPYDIR)
gcc -shared test.o test_wrap.o -o _test.so

然后我尝试运行Python代码:

#python3.7
import numpy, test
x = numpy.array([0.0, 0., 0, 0])
test.matrix(x)
print(x)

y = x - 1j
test.cmatrix(y) //raises error
print(y)

然后我得到了错误

Traceback (most recent call last):
  File "teste.py", line 8, in <module>
    rms.cmatrix(y)
TypeError: cmatrix() takes exactly 2 arguments (1 given)

我不知道我在做什么错。我想避免将我的库包装在将复数数组分成两个数组的函数中(一个用于实数,另一个用于虚数部分)。

使用SWIG用复杂的数组(指针)参数包装C函数的正确方法是什么?

0 个答案:

没有答案