SWIG未知の長さ配列を持つNumPy C拡張

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

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

a b N Ny >)は関数内ではなく、( malloc で) a b が割り当てられます。

4
これは排他的にCの質問ですか? Swigは、元の関数をラップしてしまったとしても、C ++の std :: vector で解決するのがずっと簡単です。
追加された 著者 Flexo,
SWIGを放棄する理由はありません。 SWIGのタイプマップ(彼らは地獄のように複雑です)を使わないでください。必要に応じて独自のラッパーを記述し、PyObject *パラメータを返すことができます。 SWIGはそれらを認識しますが、簡単なケース(intなど)を扱います。
追加された 著者 maxy,
はい、それは排他的にCの質問です。私はこの問題のためにSWIGをあきらめて、うまく動作するラッパーを手作業で書いた。私は答えを投稿することができますが、私はSWIGを使用しないので、実際にはこの質問に対する答えではありません。
追加された 著者 Pim Schellart,

1 答え

SWIG(または他のPythonラッパージェネレータ)はこれを行うことができないようです。 PyArray_SimpleNew または PyArray_SimpleNewFromData を使用して出力配列を作成することで、Pythonラッパーを手作業で書くことになりました。 後者の場合、メモリリークを発生させないように注意する必要があります。 それを少し試してみたところ、私は単純な<​​code> memcpy と組み合わされた方が安全であることがわかりました。

1
追加された