正しい方法は何ですか(seg.faultを取得しています) uint8
バッファを次のように定義されたC関数に変換します。
void f(uint8* p, size_t len)
_lib.f.argtypes=[ctypes.POINTER(ctypes.c_ubyte), ctypes.c_uint]
回答:
回答№1は2あなたのコメントに入れた方法で作成された配列オブジェクト - (cbytes.c_ubyte * 256)()
は大丈夫です。 しかしctypes "jargon"では、このオブジェクトはctypes.POINTER(ctypes.c_ubyte)と等価ではありません - ctypesは、配列をパラメータとして呼び出そうとしたときに警告する必要があります。
とにかく、おそらくあなたが作成された配列を渡すときパラメータとして、ctypesはその内容への参照を渡すのではなく、Cの何か他のもの(おそらくその内容ではなくPythonオブジェクトのアドレス)を渡します。
配列の内容へのポインタを、作成したPOINTER型にキャストすると、おそらく動作します:
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)