简单的回答是,您需要使用接受两个输入的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的支持,而不仅仅是列表。在