2011-12-23 15 views
7

Mi piacerebbe creare il mio contenitore di liste molto personale usando Cython. Sono un nuovo principiante ad esso, e in seguito la documentazione ho potuto ottenere per la creazione di una tale struttura:Creazione di strutture C in Cython

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

ma quando arriva il momento per accedere alle componenti struct, non riesco a trovare il bene sintassi:

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

tiri: "warning: intlists.pyx: 8: 12: variabile locale 'li' si fa riferimento prima assegnazione" che mi permetta di presumo che il mio utilizzo le strutture Cython non è corretta ...

Qualsiasi idea di quello che sto facendo male qui per favore? :) Grazie per il tuo aiuto

+0

Ottengo 'Impossibile convertire 'void' in oggetto Python', ma se correggo che non ci sono errori. Hai una vecchia versione di Cython o non stai mostrando la parte rilevante del tuo codice. –

risposta

9

Devi allocare la memoria per intList. O con una variabile locale o utilizzando malloc.

cdef struct s_intList: 
    int value 
    void* next 

ctypedef s_intList intList 

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

Bello! Sembra che mi mancasse il tipo di ritorno 'oggetto'. Qualche documentazione su questo ovunque? :-) Grazie mille! – Oleiade

+0

In alternativa, lascia "oggetto". Almeno in Cython 0.16, dovrebbe restituire "None". –

4

Nel codice, li è un puntatore a un intList. Questo puntatore non è inizializzato per indicare nulla, quindi l'accesso a li.value non ha significato (ed è errato).

Nella risposta di fabrizioM, viene creato uno intList (non un puntatore a uno) nello stack, quindi nella memoria è presente una posizione riservata per li.value.

Se si desidera creare un intList con dati effettivi (che io intendo si intende essere come una struttura di dati dell'elenco collegato), e se si desidera essere in grado di restituire tale funzione da intList, ecc. Sarà necessario allocare le strutture intList nell'heap e creare l'elenco completo collegato da lì. Cython consente di chiamare facilmente malloc (e free).