python - SWIG:未定义类型映射

标签 python numpy swig

我有一个 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 接口(interface)文件,

%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

如有任何帮助,我们将不胜感激。

最佳答案

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

关于python - SWIG:未定义类型映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14763882/

相关文章:

python - 从数据文件中提取 float

python - 如何使用TideSDK openFolderChooseDialog

python - 使用 Numpy 和 while 循环生成所有可能的加法组合

python - 序列化 numpy 数组的元组

c - 痛饮错误 : Syntax Error in input(1)

c++ - Swig 在命名空间别名上给出 "unknown namespace"错误

Python unittest 测试 MongoDB 随机失败

python - 尽管 x0 在范围内,Scipy 优化仍会引发 ValueError

numpy - 如何向量化 for 循环,就像下面在 numpy 中提到的那样?

c# - C# 中的 Swig Director 异常 - 在 C++ 中获取异常文本