Я хотел бы использовать 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)
Я не знаю, что я делаю неправильно.Я хотел бы избежать упаковки моей библиотеки в функции, которые разделяют массив комплексных чисел на два массива (один для вещественного, другой для мнимой части).
Как правильно обернуть функцию C с помощьюаргумент сложного массива (указателя) с использованием SWIG?