2011-12-23 16 views
7

Chciałbym utworzyć mój własny kontener list za pomocą Cythona. Jestem bardzo nowy początkujący do niego i po dokumentacji mogłem dostać się do stworzenia takiej struktury:Tworzenie struktur C w Cython

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

ale gdy przychodzi czas na Acces członków struct, nie mogę znaleźć dobrego składnię:

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

rzuca: "UWAGA: intlists.pyx: 8: 12: zmienna lokalna 'li' odwołuje przed cesją" który pozwala mi przypuszczać, że moja wykorzystanie kodowanym Cython jest błędna ...

Każdy pomysł co tutaj robię źle, proszę? :) Dziękujemy za pomoc

+0

Otrzymuję polecenie 'Nie mogę przekonwertować 'void' na obiekt Pythona', ale jeśli stwierdzę, że nie wystąpił błąd. Masz starą wersję Cythona lub nie wyświetlasz odpowiedniej części kodu. –

Odpowiedz

9

Musisz przydzielić pamięć dla intList. Z lokalną zmienną lub przy użyciu malloc.

cdef struct s_intList: 
    int value 
    void* next 

ctypedef s_intList intList 

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

Nice! Wygląda na to, że brakuje mi typu zwracanego "obiektu". Wszelka dokumentacja o tym gdziekolwiek? :-) Dziękuję bardzo! – Oleiade

+0

Ewentualnie pomiń "obiekt". Przynajmniej w Cython 0.16 powinien zwrócić 'None'. –

4

W kodzie li jest wskaźnik do intList. Ten wskaźnik nie jest zainicjowany, aby wskazywać na cokolwiek, więc dostęp do li.value jest bez znaczenia (i błędny).

W odpowiedzi na fabrykę tworzony jest intList (nie wskaźnik na jeden) na stosie, więc w pamięci zarezerwowano miejsce dla li.value.

Jeśli chcesz utworzyć intList z rzeczywistymi danymi (które, jak rozumiem, masz zamiar być jak struktura danych z listą łączy), i jeśli chcesz mieć możliwość zwrócenia tego intList z funkcji itp., Będziesz musiał przydzielaj struktury intList na stercie i stwórz z nich pełną listę połączoną. Cython pozwala na łatwe wywołanie malloc (i free).