我有一个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
任何帮助都将不胜感激。
答案 0 :(得分: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。它会告诉你在尝试匹配你的函数参数时它正在寻找什么。
答案 1 :(得分: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.])