SWIG:未定义任何类型地图

问题描述 投票:5回答:2

我有一个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文件取自here,我正在使用的类型图描述为here

任何帮助,将不胜感激。

python numpy swig
2个回答
3
投票

问题是numpy.i中的typemap定义了一个两个参数typemap,并且你试图将它应用于一个参数。如果在函数中有参数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。在尝试匹配您的函数参数时,它会告诉您它正在寻找什么。


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.])
© www.soinside.com 2019 - 2024. All rights reserved.