非常に多くの場合 (例: int *n
)、次のように書くだけで十分です。
%apply int *OUTPUT { int *n };
SWIG が出力パラメーターに提供するいくつかのデフォルトの型マップを使用します。(同様の INOUT と INPUT もあります)。
ただし、この例では、事前定義されたケースのいずれとも一致しないため、同じことを手動で行う必要があります。これは基本的に引数ごとに 2 つのタイプマップです。実際の関数呼び出し用に一時的なものを作成し、実際の入力の代わりにそれを使用する入力タイプマップと、結果を一時的なものから 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
) は自動的に名前が変更され、明らかな名前の衝突が停止します。Python のタプル%append_output
の後ろに何かを追加するために展開する SWIG マクロです。$result
関数foo
に動的にメモリが割り当てられている場合は、それを処理する必要があります。freearg 型マップは、in 型マップが動的にメモリを割り当てる必要がある場合に便利です。
これは、次のようにコンパイルして実行するのに十分でした。
import test
len,str = test.foo()
print len
print str