2011-10-28 3 views
4

SWIGでC関数をラップしたいと思います。 この関数は、(同じ長さの)2つの配列を入力として取り、さらに3つの配列を返します。 しかし、リターン配列の長さを事前に予測することはできず、これらは関数内で動的に割り当てられます。 SWIG(numpy.iを使用)でそのような関数をラップすることは可能ですか?SWIGが未知の長さ配列を持つNumPy C拡張子

int func(double **a, double **b, long int *N, double *x, double *y, long int *Nx, long int *Ny); 

場合NxNyが予めしかしNabの長さ)が知られている関数に(mallocで)割り当てられていないとabある: 簡略化関数宣言は以下のように見えます。

+0

これは排他的にCの質問ですか? Swigは、元の関数をラップしてしまったとしても、C++の 'std :: vector'で解決するのがずっと簡単です。 – Flexo

+0

はい、これは排他的にCの質問です。私はこの問題のためにSWIGをあきらめて、うまく動作するラッパーを手作業で書いた。私は答えを投稿することができますが、私はSWIGを使用しないので、実際にはこの質問に対する答えではありません。 –

+0

その理由からSWIGを放棄する理由はありません。 SWIGのタイプマップ(彼らは地獄のように複雑です)を使わないでください。必要に応じて独自のラッパーを記述し、PyObject *パラメータを返すことができます。 SWIGはそれらを認識しますが、簡単なケース(intなど)を扱います。 – maxy

答えて

1

SWIG(または他のPythonラッパージェネレータ)はこれを行うことができないようです。 私は手でPythonラッパーを書くことになりました。これは実際には簡単で、PyArray_SimpleNewまたはPyArray_SimpleNewFromDataを使って出力配列を作成しています。 後者の場合、メモリリークを発生させないように特別な注意が必要です。 ちょっと遊んだ後、単純なmemcpyと組み合わせて前者が安全であることがわかりました。

関連する問題