在Cython中创建C结构体

16

我想使用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:“警告:intlists.pyx:8:12:本地变量'li'在赋值之前引用”,这让我认为我的Cython结构使用不正确...

请问我在这里做错了什么吗? :) 感谢您的帮助


我得到了 无法将 'void' 转换为 Python 对象 的错误,但如果我修复它,就没有错误了。你要么使用旧的Cython版本,要么没有显示你代码的相关部分。 - Fred Foo
2个回答

17

您需要为intList分配内存。可以使用本地变量或malloc来实现。

cdef struct s_intList:
    int    value
    void*  next

ctypedef s_intList intList

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

太好了!看起来我漏掉了“对象”返回类型。这方面有任何文档吗?:-) 非常感谢! - Oleiade
另外,可以省略“object”。至少在Cython 0.16中,它应该返回“None”。 - Conrad Meyer

6
在你的代码中,li是指向intList的指针。这个指针没有初始化指向任何东西,因此访问li.value是没有意义的(并且是错误的)。
在fabrizioM的答案中,一个intList被创建(而不是指向一个),在堆栈上有一个内存位置保留了li.value
如果你想创建一个带有实际数据的intList(我猜你打算像链表数据结构一样),并且想能够从函数等返回该intList,那么你必须在堆上分配intList结构,并从那里构建完整的链表。Cython允许你轻松调用malloc(和free)来完成这个任务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接