2

次の 2 つのメソッドを使用して C++ で記述された Publisher クラスがあります。

PublishField(char* name, double* address);
GetFieldReference(char* name, double*& address);

このクラスの Python バインディングは、SWIG を使用して生成されています。私の swig .i ファイルには次のものがあります。

 %pointer_class(double*, ptrDouble);

これにより、Python 変数で定義されたフィールドを公開できます。

value = ptrDouble()
value.assign(10.0)
PublishField("value", value.cast())

ただし、GetFieldReference メソッドを使用しようとすると、TypeError が発生します。

GetFieldReference("value", newValue)

ptrDouble を返す double*& のタイプマップを作成する必要があると思いますが、それがどのようになるかはよくわかりません。

4

2 に答える 2

1

これが私が思いついた実用的なソリューションです。

swig.i ファイルにラッパー関数を追加します。

%inline %{
    double * GetReference(char* name, Publisher* publisher)
    {
         double* ptr = new double;
         publisher->GetFieldReference(name, ptr);
         return ptr;
    }
%}

これで、Python から以下を使用できるようになりました。

value = ptrDouble.frompointer(GetFieldReference("value", publisher)
于 2009-10-02T15:55:05.033 に答える
0

このタイプマップは問題を解決するはずです-

// Typemaps for double *&
%typemap(in) double *& (double *ppDouble  = NULL) %{
$1 = &ppDouble  ;
%}

%typemap(argout) double *& {
*(double **)&jarg2 = *$1;
}

%typemap(javain) double *& "$javainput"

jarg2 (「argout」タイプマップ内) に必要な double 値を割り当てることが正しいかどうか、または代わりに jarg1 を割り当てる必要があるかどうかを確認する必要がある場合があります。

于 2010-04-01T15:38:14.363 に答える