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接口文件,
%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。这样可以告诉你在匹配函数参数时,它在寻找什么。