es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El fragmento de código intenta convertir una matriz numpy.ndarray de cadenas de caracteres numpy.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 de foo. Esto se debe probablemente a que la conversión de numpy.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 de numpy.ndarray para convertir las cadenas de caracteres numpy.unicode_ en cadenas de caracteres de estilo C antes de pasarlas a CFFI. El código actualizado se vería así:

    c_values = values.astype('S')
    p = ffi.new("char*[]", c_values)
    foo(p)
    

    El método astype convierte las cadenas de caracteres numpy.unicode_ en cadenas de caracteres numpy.bytes_, que son equivalentes a cadenas de caracteres de estilo C. La matriz resultante c_values se puede pasar a CFFI utilizando la función ffi.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.

Comments are closed.