6

構造体を含む C ライブラリをラップしています。

struct SCIP
{
//...
}

そして、そのような構造体を作成する関数:

void SCIPcreate(SCIP** s)

SWIG はそれから python クラスSCIPと関数SCIPcreate(*args)を生成します。

Python で呼び出そうとSCIPcreate()すると、明らかに type のパラメーターが必要になりますがSCIP**、どうすればそのようなものを作成できるのでしょうか?

または、自動的SCIPに呼び出すコンストラクターを使用してクラスを拡張する必要がありますか? SCIPcreate()もしそうなら、どうすればいいですか?

4

1 に答える 1

5

ヘッダー ファイルを指定すると、次のようになります。

struct SCIP {};

void SCIPcreate(struct SCIP **s) {
  *s = malloc(sizeof **s);
}

以下を使用してこの関数をラップできます。

%module test
%{
#include "test.h"
%}

%typemap(in,numinputs=0) struct SCIP **s (struct SCIP *temp) {
  $1 = &temp;
}

%typemap(argout) struct SCIP **s {
  %set_output(SWIG_NewPointerObj(SWIG_as_voidptr(*$1), $*1_descriptor, SWIG_POINTER_OWN));
}

%include "test.h"

これは 2 つの型マップで、1 つは関数への入力として使用されるローカルの一時ポインターを作成するためのもので、もう 1 つは呼び出し後にポインターの値を戻り値にコピーするためのものです。

これに代わる方法として%inline、オーバーロードを設定するために使用することもできます。

%newobject SCIPcreate;
%inline %{
  struct SCIP *SCIPcreate() {
    struct SICP *temp;
    SCIPcreate(&temp);
    return temp;
  }
%}
于 2012-11-18T17:34:23.043 に答える