SWIG:未定义任何类型映射

5 投票
2 回答
3412 浏览
提问于 2025-04-17 15:11

我有一个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文件是从这里获取的,而我使用的类型映射在这里有说明。

希望能得到一些帮助。

2 个回答

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.])
3

问题在于,numpy.i中定义的类型映射是需要两个参数的,而你却试图用它来处理一个参数。如果你的函数有int len1和double* vec1这两个参数,这样就可以正常工作了:

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

与其自己写一个类型映射,不如直接使用carrays.i

如果你真的想写一个类型映射,比如说要接收一个包含多个double的元组作为输入,它的写法大概是这样的:

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

这样的话,你就可以按照你预期的方式将它应用到你的函数上。

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

想要弄清楚为什么不能使用类型映射,一个好的起点是用-tmsearch选项运行SWIG。这样可以告诉你在匹配函数参数时,它在寻找什么。

撰写回答