2011-12-23 58 views
7

我想用Cython创建我自己的列表容器。我是一个非常新的初学者到它,文档,我可以去创造这样的结构如下:在Cython中创建C结构

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:局部变量‘礼’任务之前引用的” 这让我假设我用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允许您轻松地拨打malloc(和free)来执行此操作。