2011-12-23 59 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)來執行此操作。