web-dev-qa-db-ja.com

Python ctypesのポインターと配列

私はDLLのようなプロトタイプを持つC関数を含む:

int c_read_block(uint32 addr, uint32 *buf, uint32 num);

Ctypesを使用してPythonから呼び出します。この関数は、結果を書き込むメモリのチャンクへのポインタを想定しています。このようなaを構築して渡す方法がわかりませんメモリのチャンクctypesのドキュメントはあまり役に立ちません。

次のように、配列を作成して「byref」を渡します。

 cresult =(c_ulong * num)()
 err = self.c_read_block(addr、byref(cresult)、num)

次のエラーメッセージが表示されます。

ArgumentError: argument 3: <type 'exceptions.TypeError'>: expected LP_c_ulong instance instead of pointer to c_ulong_Array_2

これは、Python ulong配列がc uint32配列に似ていないためです。create_char_string。もしそうなら、どのように私はPythonをLP_c_ulongにそのバッファを「キャスト」するように説得するのですか?

35

cast 関数でキャストできます:)

>>> import ctypes
>>> x = (ctypes.c_ulong*5)()
>>> x
<__main__.c_ulong_Array_5 object at 0x00C2DB20>
>>> ctypes.cast(x, ctypes.POINTER(ctypes.c_ulong))
<__main__.LP_c_ulong object at 0x0119FD00>
>>> 
54
Mark Rushakoff

結果をキャストできますが、ctypesを使用すると、ポインターの代わりに配列を直接使用できます。問題は、コード内のbyrefです(これは、ポインターへのポインターに相当します)。

代わりに:

cresult = (c_ulong * num)()
err = self.c_read_block(addr, byref(cresult), num)

試してください:

cresult = (c_ulong * num)()
err = self.c_read_block(addr, cresult, num)
1
ephemer