2

私はC++クラスを持っており、そのメソッドのdouble *1つは、そのメンバー変数の1つである配列のようなものを返します。Pythonでこれをリストとしてアクセスできるようにしようとしています。私はそれをでラップし、doubleArray_frompointerdeepcopyを使用して安全にそこから出そうとしますがdoubleArray、スコープ外になり、そのメモリがクリーンアップされ、C ++クラスが同じメモリをクリーンアップしようとすると、まだ問題があります(それは私が作成した要点には示されていませんが)。

タイプマップでこれを行うべきだと思います。

私がラップしようとしているのは:

double *foo() {
  double *toReturn = new double[2];
  toReturn[0] = 2;
  toReturn[1] = 4;
  return toReturn;
}

インターフェースは次のとおりです。

%module returnList
%include "returnList.h"

%include "cpointer.i"
%pointer_functions(double, doubleP)

%include "carrays.i"
%array_class(double, doubleArray);

%{
#include "returnList.h"
%}
4

2 に答える 2

3

タイプマップを使用して、Python側でループを記述しないようにすることができると言っているのは正しいです。私は例をまとめました-それはこの他の答えにかなり似ています。

%module test

%typemap(out) double *foo %{
  $result = PyList_New(2); // use however you know the size here
  for (int i = 0; i < 2; ++i) {
    PyList_SetItem($result, i, PyFloat_FromDouble($1[i]));
  }
  delete $1; // Important to avoid a leak since you called new
%}

%inline %{
double *foo() {
  double *toReturn = new double[2];
  toReturn[0] = 2;
  toReturn[1] = 4;
  return toReturn;
}
%}

ここでのタイプマップは、fooreturningと呼ばれる関数と一致します。より広く一致する可能性がありますが、戻り値がサイズ2の配列を返すことを意味しない場合double *、関数に対して間違ったことを行うリスクがあります。double *

このタイプマップを使用して、次を実行できます。

Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.foo()
[2.0, 4.0]
>>>

このように手動で記述する必要がある理由は、SWIGがから返される配列の長さを推測する方法がないためですfoo。呼び出しによっても異なる可能性があります。

于 2012-12-29T10:03:37.533 に答える
0

私は、ベクトルや配列のようなオブジェクトを返すのではなく、最初に配列を生成した(単純な)ループをPythonで再作成することで、問題を「解決」しました。つまり、私のC ++コードは個々のdoubleを返すだけでよく、Pythonコードはリストをアセンブルします。

もう少し明確にするために、私はC ++メソッドdouble *simulation.run()を使用していますが、これは問題を引き起こしていました。新しいC++メソッドを作成し、Pythonの反復double simulation.doRound()ループでSWIGを介してこれを呼び出し、各反復を実行しました。numRoundsoutputs.append(simulation.doRound())

double *ただし、これは基本的な操作のように思われるため、SWIGを介してC /C++配列をPythonリストにコピーする方法を知りたいと思います。誰かがそれに答えることができれば、私は受け入れられた答えなどをマークします。

于 2012-12-26T05:08:33.267 に答える