Cuál es la forma correcta (me estoy haciendo seg.fault) para enviar un buffer uint8
a una función de C definen como:ctypes pitón uint8 uso de búfer
void f(uint8* p, size_t len)
_lib.f.argtypes=[ctypes.POINTER(ctypes.c_ubyte), ctypes.c_uint]
Cuál es la forma correcta (me estoy haciendo seg.fault) para enviar un buffer uint8
a una función de C definen como:ctypes pitón uint8 uso de búfer
void f(uint8* p, size_t len)
_lib.f.argtypes=[ctypes.POINTER(ctypes.c_ubyte), ctypes.c_uint]
Los objetos de matriz creados por la forma en que se pone en tu comentario - (cbytes.c_ubyte * 256)()
está bien. Pero en la "jerga" de ctypes este objeto no es equivalente a ctypes.POINTER (ctypes.c_ubyte) - los ctypes deberían haberle avisado cuando intentó llamar a la función con la matriz como parámetro.
De todos modos, probablemente cuando pase la matriz creada como el parámetro, ctypes no pasa una referencia a su contenido, sino otra cosa a C (tal vez la dirección del objeto Python, no de su contenido).
Si lanzas un puntero al contenido de la matriz al tipo de puntero que ha creado, es probable que trabajar:
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)
Dónde están los datos en realidad está tratando de enviar? Es necesario que veas lo que has intentado hasta ahora. – jsbueno
Probé (cbytes.c_ubyte * 256)() – mete