2011-12-23 13 views
7

में सी structs बनाना मैं साइथन का उपयोग कर अपना खुद का सूची कंटेनर बनाना चाहता हूं।साइथन

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

लेकिन जब समय struct सदस्यों acces की बात आती है, मैं अच्छा वाक्य रचना नहीं मिल रहा है: मैं यह करने के लिए एक बहुत ही नई शुरुआत है, और प्रलेखन मैं इस तरह की संरचना बनाने के लिए मिल सकता है निम्नलिखित हूँ:

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

फेंकता है: "चेतावनी: intlists.pyx: 8: 12: स्थानीय चर 'ली' असाइनमेंट से पहले संदर्भित" जो मुझे लगता है कि मेरी cython structs उपयोग गलत है चलो ...

किसी भी विचार मैं यहाँ क्या गलत कर रहा हूँ? :) आपकी मदद के लिए धन्यवाद

+0

मुझे 'पायथन ऑब्जेक्ट' में 'शून्य नहीं बदला जा सकता', लेकिन अगर मैं ठीक करता हूं तो कोई त्रुटि नहीं है। आपके पास या तो पुराना साइथन संस्करण है, या आप अपने कोड का प्रासंगिक हिस्सा नहीं दिखा रहे हैं। –

उत्तर

9

आपको अंतर्दृष्टि के लिए स्मृति आवंटित करना होगा। या तो स्थानीय चर या 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

वैकल्पिक रूप से, 'ऑब्जेक्ट' छोड़ दें। कम से कम साइथन 0.16 में, इसे 'कोई नहीं' वापस करना चाहिए। –

4

अपने कोड में, li एक सूचक एक intList है। यह पॉइंटर किसी भी चीज़ को इंगित करने के लिए प्रारंभ नहीं किया गया है, इसलिए li.value तक पहुंच अर्थहीन (और गलत) है।

fabrizioM के उत्तर में, intList स्टैक पर बनाया गया है (एक पॉइंटर नहीं), इसलिए li.value के लिए आरक्षित स्मृति में एक स्थान है।

आप वास्तविक डेटा के साथ एक intList, और (जो मैं तुम्हें एक लिंक्ड सूची डेटा संरचना की तरह बनना चाहते हैं इकट्ठा) बनाने के लिए चाहते हैं तो आप वापस जाने के लिए है कि intList कार्यों से, आदि आप करना होगा सक्षम होना चाहते हैं, तो ढेर पर अपने intList structs आवंटित करें और वहां से पूरी तरह से जुड़ी सूची का निर्माण करें। साइथन आपको यह करने के लिए आसानी से malloc (और free) पर कॉल करने की अनुमति देता है।

संबंधित मुद्दे