2011-12-23 22 views
7

Cython'u kullanarak kendi liste kapsayıcısını oluşturmak istiyorum.Cython'da C yapıları oluşturma

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

ancak yapı üyelerini acces zamanı geldiğinde, ben iyi sözdizimi bulamıyorum: Ben böyle bir yapıyı oluşturmak için alabilir belgelerine aşağıdaki bir çok yeni buna BEGGINER ve kulüpler:

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

atar: "uyarısı: intlists.pyx: 8: 12: atama öncesinde başvurulan yerel değişken 'li'" benim Cython yapılar kullanımı yanlış olduğunu varsayalım ...

konusunda fikrin Burada ne yapıyorum lütfen? :) Yardımınız için teşekkür ederiz. Yardım

+0

'void' öğesini Python nesnesine dönüştürebilirim ', ancak düzeltmezseniz hata yok. Ya eski bir Cython sürümünüz var veya kodunuzun ilgili bölümünü göstermiyorsunuz. –

cevap

9

IntList için belleği ayırmanız gerekir. Yerel bir değişkenle veya malloc kullanarak ile. Kodunuzda

cdef struct s_intList: 
    int value 
    void* next 

ctypedef s_intList intList 

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

Güzel! Görünüşe göre 'object' dönüş tipi eksik. Bu konuda herhangi bir belge var mı? :-) Çok teşekkür ederim! – Oleiade

+0

Alternatif olarak, 'nesneyi' dışarıda bırakın. En azından Cython 0.16'da, 'None'ı döndürmelidir. –

4

, li bir intList bir işaretçi olduğunu. Bu işaretçi herhangi bir şeye işaret etmek için başlatılmamıştır, bu nedenle li.value'a erişmek anlamsızdır (ve hatalıdır).

FabrizioM'un yanıtında, yığın üzerinde intList (bir işaretçi değil) oluşturulur, böylece li.value için ayrılmış bellekte bir yer vardır.

sen ve (ı bağlantılı bir liste veri yapısı gibi olmak niyetinde toplamak) gerçek verilerle bir intList oluşturmak istiyorsanız işlevlerden intList, vb zorunda kalacağını iade edebilmek istiyorsanız intList yapınızı yığına ayırın ve tam bağlantılı listeyi buradan oluşturun. Cython bunu yapmak için kolayca malloc (ve free) aramanızı sağlar.

İlgili konular