1

Swigのマニュアルは私にはちょっと混乱します。CコードをPythonでテストできるように、CライブラリをPythonにラップしています。ここで、PythonでCポインタアドレスにアクセスする方法を知りたいです。たとえば、これは私が持っているコードです。

typedef struct _buffer_t {
char buf[1024];
char *next_ptr;
} buffer_t;



void parse_buffer(buffer_t * buf_p) {
    buf_p -> next_ptr ++;
}

私がやりたかったのは以下のCコードです

buffer_t my_buf;
my_buf.next_ptr = my_buf.buf;
parse_buffer(&my_buf);
expect_equal(&(my_buf.buf)+1, my_buf.next_ptr);

Pythonで同じことをするにはどうすればよいですか?SWIGラップされたモジュールをインポートした後、Pythonでbuffer_tクラスがあります。

4

1 に答える 1

1

問題は、SWIGがPythonでバッファを文字列としてラップしようとしていることです。これは単なるポインタではありません。の合成された割り当てnext_ptrは、ポインタの割り当てを行うだけでなく、メモリを割り当てて文字列のコピーを作成します。これはいくつかの方法で回避できます。

最も簡単な%extend方法は、Pythonで「リセットバッファ」メソッドを追加するために使用することです。

%extend {
  void resetPtr() {
    $self->next_ptr=$self->buf;
  }
}

その後、Pythonで呼び出して、必要な割り当てを行うことができます。

または、バッファを強制的に別のポインタとして処理する場合は、SWIGに両方のメンバーをとの代わりに強制的に処理させることができvoid*ます。タイプごとと同じくらい簡単になることを望んでいましたが、私のテストでは、memberinとmemberoutでは正しく機能しないようです。char*char[]%apply

%apply void * { char *next };
%apply void * { char buf[ANY] };

memberin / memberoutタイプマップがこの作業を行うために重要であることを考えると、私%extendはこれがはるかにクリーンなソリューションだと思います。

于 2013-02-20T22:12:39.307 に答える