2012-02-04 1 views
5

PythonのctypesのUINT8バッファ使用として定義C関数に<code>uint8</code>バッファを送信するための正しい方法(私はseg.faultを取得しています)とは何

void f(uint8* p, size_t len) 

_lib.f.argtypes=[ctypes.POINTER(ctypes.c_ubyte), ctypes.c_uint] 
+0

どこのデータは、あなたが実際に送信しようとしているのですか?それはあなたがこれまでに試したことを見るために良かった。 – jsbueno

+0

私は試しました(cbytes.c_ubyte * 256)() – mete

答えて

2

はあなたが置く方法によって作成された配列オブジェクトあなたのコメント - (cbytes.c_ubyte * 256)()は問題ありません。 しかし、ctypes "jargon"では、このオブジェクトはctypes.POINTER(ctypes.c_ubyte)と同じではありません - ctypesは配列をパラメータとして呼び出そうとしたときに警告する必要があります。

おそらく、パラメータとして作成された配列を渡すと、おそらくctypesはその内容への参照を渡すのではなく、Cの内容(おそらくPythonオブジェクトのアドレスではなく内容)を参照します。あなたが作成したポインタ型へのあなたの配列の内容へのポインタをキャストした場合

、それはおそらく動作します:

pointer_type = ctypes.POINTER(ctypes.c_ubyte) 
_lib.f.argtypes=[pointer_type), ctypes.c_uint] 
data_block = (ctypes.c_ubyte * 256)() 
pointer = ctypes.cast(ctypes.addressof(data_block, pointer_type)) 
_lib.f(pointer, 256) 
+0

私はこれを試してみます。 ctypes配列以外のバッファを作成する他の方法はありますか? – mete

+0

私はseg.faultが何か他のものに起因することを認識しました。今私は直接パラメーターとしてバッファーを送信しており、問題はありません。 – mete

関連する問題