python数组 swig_有没有一种方法可以使用SWIG将不同的数组类型从python传递到c++?...

简单的回答是,您需要使用接受两个输入的typemap,但将numinputs属性设置为1,例如:%module test

%typemap(in,numinputs=1) (double *a, size_t) %{

assert(PyList_Check($input));

$2 = PyList_Size($input);

$1 = malloc(sizeof *$1 * $2);

for(size_t i = 0; i < $2; ++i) {

$1[i] = PyFloat_AsDouble(PyList_GetItem($input, i));

}

%}

%typemap(in, numinputs=1) (int *b, size_t) %{

assert(PyList_Check($input));

$2 = PyList_Size($input);

$1 = malloc(sizeof *$1 * $2);

for (size_t i = 0; i < $2; ++i) {

$1[i] = PyInt_AsLong(PyList_GetItem($input, i));

}

%}

%typemap(freearg) (double *a, size_t) %{

free($1);

%}

%typemap(freearg) (int *b, size_t) %{

free($1);

%}

%inline %{

double myfun(double *a, size_t n, int *b, size_t m) {

(void)a; (void) b;

printf("%d, %d\n", n, m);

for (size_t i = 0; i < (n > m ? n : m); ++i) {

printf("%d: %f - %d\n", i, i < n ? a[i] : 0, i < m ? b[i] : 0);

}

return 1.0;

}

%}

这是可行的,每对(array,len)都有一个类型映射,足以用作:

^{pr2}$

我们本可以使用alloca或C99的VLA特性来避免对malloc调用的需要,但为了说明这一点。在

(注意:您没有在函数原型中的任何地方编写const,但这意味着它不会修改输入数组。如果不是这样,则需要编写相应的argout typemap,以便从分配的数组复制回Python列表)。在

不过,这也是相当重复的,所以如果我们可以在两者之间共享一些代码,那就更好了——如果需要的话,可以使用一些更高级的SWIG特性来实现。如果需要,您还可以添加对memory views的支持,而不仅仅是列表。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值