2011-12-23 2 views
7

Я хотел бы создать свой собственный контейнер списка с помощью Cython. Я очень новый новичок в этом, и после документации, которую я мог бы получить, чтобы создать такую ​​структуру:Создание C-структур в Cython

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

, но когда приходит время, чтобы Acces элементов этой структуры, я не могу найти хороший синтаксис:

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

бросает: "предупреждение: intlists.pyx: 8: 12: локальная переменная 'ли' обращаться до присвоения" , который позволил мне предположить, что мое использование Cython Структуры неверно ...

Любой идею о том, что я делаю неправильно здесь, пожалуйста? :) Благодарим вас за помощь

+0

Я получаю 'Невозможно преобразовать 'void' в объект Python', но если я исправлю, что ошибок нет. У вас либо есть старая версия Cython, либо вы не показываете соответствующую часть своего кода. –

ответ

9

Вы должны выделить память для intList. Либо с локальной переменной, либо с с использованием malloc.

cdef struct s_intList: 
    int value 
    void* next 

ctypedef s_intList intList 

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

Ницца! Кажется, мне не хватает типа возвращаемого объекта. Любая документация об этом где угодно? :-) Большое спасибо! – Oleiade

+0

Альтернативно, оставьте «объект». По крайней мере, в Cython 0.16 он должен возвращать 'None'. –

4

В коде li это указатель к intList. Этот указатель не инициализируется, чтобы указывать на что-либо, поэтому доступ к li.value бессмыслен (и ошибочен).

В ответе fabrizioM создается intList (не указатель на один) в стеке, поэтому в памяти зарезервировано место для li.value.

Если вы хотите создать intList с фактическими данными (я понимаю, вы собираетесь быть как связаны структуры данных списка), и если вы хотите, чтобы иметь возможность вернуться, что intList из функций и т.д., вам придется выделите свои intList структуры в куче и создайте полный список ссылок. Cython позволяет вам звонить по телефону mallocfree).

Смежные вопросы