SWIG:没有定义类型映射

Posted

技术标签:

【中文标题】SWIG:没有定义类型映射【英文标题】:SWIG: No typemaps are defined 【发布时间】:2013-02-08 00:43:22 【问题描述】:

我有一个 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

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

问题是 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。它会告诉您在尝试匹配您的函数参数时它在寻找什么。

【讨论】:

正如您在此处看到的 [docs.scipy.org/doc/numpy-dev/reference/…,描述了我正在使用的类型图。它甚至在 numpy.i 文件中。但是你的建议确实有效。必须为固定大小的数组传递大小参数是一种耻辱。哦,好吧。 我相信-tmsearch现在被称为-debug-tmsearch【参考方案2】:

这对我有用:

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

【讨论】:

以上是关于SWIG:没有定义类型映射的主要内容,如果未能解决你的问题,请参考以下文章

SWIG:如何使用 %apply 返回结构? “未定义类型映射”警告

如何定义 swig 类型映射以将 unsigned char* 返回到 java

SWIG - 包装到 C# 时 std::list 没有默认类型映射,我该怎么办?

Swig 类型映射内部构造函数到受保护

swig 啥时候需要类型映射?

SWIG——在扩展内使用类型映射