Cómo crear una representación CFFI válida de una matriz de cadenas unicode en numpy?
Tengo una matriz de numpy.ndarray
llamada values
que contiene cadenas numpy.unicode_
y tengo una función en C llamada foo
que consume una matriz de cadenas en C. Existe una interfaz de envoltura de CFFI para foo
.
Entonces he intentado hacer algo como esto:
p = ffi.from_buffer("char**", values)
y también
p = ffi.from_buffer("char*[]", values)
Esto no da ningún error en CFFI. Pero una vez que ejecuto el código, se bloquea en la implementación en C de foo
y de hecho, cuando miro los punteros, parecen estar corruptos:
(gdb) p d
$1 = (char **) 0x1f978a50
(gdb) p d[0]
$2 = 0x7300000061 <error: cannot="" access="" memory="" at="" address="" 0x7300000061="">
Estoy en una arquitectura de 64 bits.
davy.ai
El fragmento de código intenta convertir una matriz
numpy.ndarray
de cadenas de caracteresnumpy.unicode_
en una matriz de cadenas de caracteres C utilizando CFFI. Si bien el código no muestra errores en CFFI, se produce un fallo en la implementación en C defoo
. Esto se debe probablemente a que la conversión denumpy.ndarray
a matriz en C no es correcta, como se muestra mediante los punteros incorrectos.Para solucionar esto, una posible solución es utilizar el método
astype
denumpy.ndarray
para convertir las cadenas de caracteresnumpy.unicode_
en cadenas de caracteres de estilo C antes de pasarlas a CFFI. El código actualizado se vería así:El método
astype
convierte las cadenas de caracteresnumpy.unicode_
en cadenas de caracteresnumpy.bytes_
, que son equivalentes a cadenas de caracteres de estilo C. La matriz resultantec_values
se puede pasar a CFFI utilizando la funciónffi.new
para crear una nueva matriz de cadenas de caracteres de estilo C.Esto asegurará que los punteros se pasen correctamente a la implementación en C de
foo
, evitando los errores de acceso a memoria.