5

我有一个 c++ 类,我正在尝试使用 SWIG 为 Python 包装。我在尝试包装将数组作为输入的函数之一时遇到了麻烦。

这是头文件,

class dyndiff_data_t
    {
    private:    

        double H[3];
        double GAMMA;
        double k;
        double P;
    public:
        dyndiff_data_t(double H_[3],
                        const double GAMMA_,
                        const double k_,
                        const double P_);

        void test();
    };

这是 swig 接口文件,

%module twowave
%{
  #define SWIG_FILE_WITH_INIT
  #include <twowave.h>
%}

%include "numpy.i"
%init %{
import_array();
%}

%apply (double IN_ARRAY1[3]) {(double H_[3])};

%include <twowave.h>

问题是对于数组输入,SWIG 抱怨没有类型映射。我不明白为什么。numpy.i 文件取自此处,我使用的类型图在此处进行了描述

任何帮助,将不胜感激。

4

2 回答 2

3

问题是 numpy.i 中的类型映射定义了两个参数类型映射,并且您试图将其应用于单个参数。如果您的函数中有参数 int len1 和 double* vec1,这将起作用:

%apply (int DIM1, double* IN_ARRAY1) {(int len, double* H_)}

无需编写自己的类型图,只需使用carrays.i 即可

如果你要编写一个类型映射,例如将一个双精度元组作为输入,它看起来像:

%typemap(in) double TUPLE[ANY]
{
   ...
}

在这种情况下,您将以您期望的方式将其应用于您的功能。

%apply double TUPLE[3] {double H_[3]}

尝试找出为什么不能使用类型映射时,一个很好的起点是使用该-tmsearch选项运行 SWIG。它会告诉您在尝试匹配您的函数参数时它在寻找什么。

于 2013-02-08T10:22:53.877 回答
0

这对我有用:

为了

void get_position(double outarray[3])

采用

%apply (double ARGOUT_ARRAY1[ANY]) {(double outarray[3])};

(注意 [ANY] 和 [3])

导致

a.get_position()
Out[2]: array([0., 0., 0.])
于 2019-02-21T13:19:28.840 回答