Создание C-структур в Cython - PullRequest
       46

Создание C-структур в Cython

12 голосов
/ 23 декабря 2011

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

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

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

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

throws: "warning: intlists.pyx: 8: 12: локальная переменная 'li', на которую ссылаются перед присваиванием" что позволяет мне предположить, что использование моего структуры Cython неверно ...

Есть идеи, что я здесь делаю не так, пожалуйста? :) Спасибо за помощь

Ответы [ 2 ]

13 голосов
/ 27 декабря 2011

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

cdef struct s_intList:
    int    value
    void*  next

ctypedef s_intList intList

cpdef object foo():
    cdef intList li
    li.value = 10
4 голосов
/ 15 мая 2014

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

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

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

...