2012-02-04 12 views
5

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] 
+0

Dónde están los datos en realidad está tratando de enviar? Es necesario que veas lo que has intentado hasta ahora. – jsbueno

+0

Probé (cbytes.c_ubyte * 256)() – mete

Respuesta

2

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) 
+0

Voy a intentar esto. ¿Hay alguna otra forma de crear tales almacenamientos intermedios que no sean matrices ctypes? – mete

+0

Me di cuenta de que seg.fault se debe a algo más. Ahora estoy enviando directamente el buffer como parámetro, y no hay problema. – mete