2011-12-23 16 views
7

Me gustaría crear mi propio contenedor de listas usando Cython. Soy un principiante muy nuevo a la misma, y ​​siguiendo la documentación que pude llegar a la creación de una estructura de este tipo:Creando estructuras C en Cython

cdef struct s_intList: 
    int value 
    void* next 
ctypedef s_intList intList 

pero cuando llega el momento de acces los miembros de la estructura, no puedo encontrar la buena sintaxis:

cpdef void foo(): 
    cdef intList* li 
    # li.value OR li->value 

tiros: "aviso: intlists.pyx: 8: 12: variable local 'li' que se hace referencia antes de la asignación" lo cual me permitió suponer que mi uso de estructuras Cython es incorrecta ...

Cualquier idea de lo que estoy haciendo mal aquí por favor? :) Gracias por su ayuda

+0

Obtengo 'No se puede convertir 'void' en objeto de Python', pero si lo soluciono, no hay ningún error. O tiene una versión anterior de Cython o no muestra la parte relevante de su código. –

Respuesta

9

Tiene que asignar la memoria para la intList. Ya sea con una variable local o usando malloc.

cdef struct s_intList: 
    int value 
    void* next 

ctypedef s_intList intList 

cpdef object foo(): 
    cdef intList li 
    li.value = 10 
+0

¡Agradable! Parece que me faltaba el tipo de devolución 'objeto'. ¿Alguna documentación sobre esto en cualquier lugar? :-) ¡Muchas gracias! – Oleiade

+0

Alternativamente, omita el 'objeto'. Al menos en Cython 0.16, debería devolver 'None'. –

4

En su código, li es un puntero a un intList. Este puntero no se inicializa para apuntar a nada, por lo que acceder a li.value no tiene sentido (y es erróneo).

En la respuesta de fabrizioM, se crea un intList (no un puntero a uno) en la pila, por lo que hay una ubicación en la memoria reservada para li.value.

Si desea crear un intList con datos reales (que supongo que pretende ser como una estructura de datos de lista vinculada), y si desea poder devolver ese intList desde funciones, etc. tendrá que asigne sus estructuras intList en el montón y compile la lista completa desde allí. Cython le permite llamar al malloc (y free) fácilmente para hacer esto.