: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]
: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]
はあなたが置く方法によって作成された配列オブジェクトあなたのコメント - (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)
どこのデータは、あなたが実際に送信しようとしているのですか?それはあなたがこれまでに試したことを見るために良かった。 – jsbueno
私は試しました(cbytes.c_ubyte * 256)() – mete