Оборачивание функции C со сложным массивом (указателем) в качестве аргумента с использованием SWIG? - PullRequest
0 голосов
/ 28 декабря 2018

Я хотел бы использовать 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?

...