对于相当多的情况(例如int *n
),编写以下内容就足够了:
%apply int *OUTPUT { int *n };
它使用 SWIG 为输出参数提供的一些默认类型映射。(也有类似的 INOUT 和 INPUT)。
在这种情况下,虽然我们不完全匹配任何预定义的情况,所以我们需要手动做同样的事情。这基本上是每个参数两个类型映射 - 一个输入类型映射,它为实际函数调用创建一些临时的东西,并使用它而不是一些真实的输入,以及一个将结果从临时返回到 Python 的 argout。在 Python 的情况下,使用元组返回多个参数是有意义的。
一个例子:
%module test
%typemap(in,numinputs=0) int& n (int temp) "$1 = &temp;"
%typemap(in,numinputs=0) char **data (char *temp) "$1 = &temp;"
%typemap(argout) char **data {
%append_output(PyString_FromString(*$1));
}
%typemap(argout) int& n {
%append_output(PyInt_FromLong(*$1));
}
%inline %{
void foo(int& n, char **data) {
static char str[] = "Hello world";
*data = str;
n = sizeof str;
}
%}
注意事项:
临时变量 ( int temp
, char *temp
) 会自动重命名,从而停止明显的名称冲突。是一个 SWIG 宏,它扩展为在 Python%append_output
的元组后面添加一些东西。$result
如果您的函数foo
是动态分配的内存,您需要处理它。如果 in 类型映射需要动态分配内存,则 freearg 类型映射通常很有用。
这足以让我像这样编译和运行它:
import test
len,str = test.foo()
print len
print str