【问题标题】:Creating C structs in Cython在 Cython 中创建 C 结构
【发布时间】:2012-01-26 22:07:27
【问题描述】:

我想使用 Cython 创建我自己的列表容器。我是一个非常新的初学者,按照文档我可以创建这样一个结构:

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

但是当访问结构成员的时候,我找不到好的语法:

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

抛出:“警告:intlists.pyx:8:12:分配前引用的局部变量'li'” 这让我假设我的 cython 结构使用不正确......

请知道我在这里做错了什么吗? :) 谢谢你的帮助

【问题讨论】:

  • 我得到了Cannot convert 'void' to Python object,但如果我修复它就没有错误。您要么有旧的 Cython 版本,要么没有显示代码的相关部分。

标签: python c struct cython


【解决方案1】:

您必须为 intList 分配内存。使用局部变量或 使用 malloc。

cdef struct s_intList:
    int    value
    void*  next

ctypedef s_intList intList

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

【讨论】:

  • 不错!似乎我错过了“对象”返回类型。任何地方都有关于这方面的文档吗? :-) 非常感谢!
  • 或者,省略“对象”。至少在 Cython 0.16 中,它应该返回 None
【解决方案2】:

在您的代码中,li 是一个指向intList指针。这个指针没有初始化为指向任何东西,所以访问li.value 是没有意义的(而且是错误的)。

在 fabrizioM 的回答中,在堆栈上创建了一个 intList(不是指向其中的指针),因此在内存中为 li.value 保留了一个位置。

如果你想用实际数据创建一个intList(我猜你打算像一个链表数据结构),如果你想能够从函数等返回intList,你必须在堆上分配你的intList 结构并从那里建立完整的链表。 Cython 允许您轻松调用 malloc(和 free)来执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多