我想使用Cython创建我自己的列表容器。我是一个非常新的开始,按照文档我可以创建这样的结构:
cdef struct s_intList:
int value
void* next
ctypedef s_intList intList
但是到了访问struct成员的时候,我找不到好的语法:
cpdef void foo():
cdef intList* li
# li.value OR li->value
throws:“警告:intlists.pyx:8:12:赋值前引用的局部变量'li'” 让我假设我的cython结构使用不正确......
请问我在这里做错了什么? :) 谢谢你的帮助
答案 0 :(得分:12)
您必须为intList分配内存。使用局部变量或 使用malloc。
cdef struct s_intList:
int value
void* next
ctypedef s_intList intList
cpdef object foo():
cdef intList li
li.value = 10
答案 1 :(得分:4)
在您的代码中,li
是intList
的指针。此指针未初始化为指向任何内容,因此访问li.value
毫无意义(并且是错误的)。
在fabrizioM的回答中,堆栈上创建了intList
(不是指向一个的指针),因此在内存中为li.value
保留了一个位置。
如果你想用实际数据创建一个intList
(我收集你想要的是一个链表数据结构),如果你想能够从函数中返回intList
等等,你必须在堆上分配你的intList
结构,并从那里建立完整的链表。 Cython允许您轻松调用malloc
(和free
)来完成此操作。