python arrays pointers ctypes

Punteros y matrices en Python ctypes



arrays pointers (2)

Tengo una DLL que contiene una función C con un prototipo como este:

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

Quiero llamarlo desde Python usando ctypes. La función espera un puntero a un trozo de memoria, en el que escribirá los resultados. No sé cómo construir y pasar ese pedazo de memoria. La documentación de los ctypes no es de mucha ayuda.

Construir una matriz y pasarla "byref", así:

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

Da este mensaje de error:

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

Supongo que eso se debe a que la matriz Python ulong no se parece en nada a la matriz ac uint32. Debería usar create_char_string . Si es así, ¿cómo convenzo a Python de "convertir" ese buffer en un LP_c_ulong?


Hay un error tipográfico en la solución. Para obtener un puntero a una serie de ulongs debes lanzar a un POINTER(list of ulong)

In [33]: ptr = ctypes.cast(x, ctypes.POINTER(ctypes.c_ulong*5)) In [34]: ptr Out[34]: <__main__.LP_c_ulong_Array_5 at 0x23e2560>


Puedes lanzar con la función de 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> >>>