2011-01-13 15 views
12

मैं एक structसी में एक संरचना के अंदर एक कॉन्स चर प्रारंभ करने के लिए कैसे?

struct Tree{ 
    struct Node *root; 
    struct Node NIL_t; 
    struct Node * const NIL; //sentinel 
} 

बारे में मैं

struct Node * const NIL = &NIL_t; 

चाहते मैं इसे struct के अंदर प्रारंभ नहीं कर सकते हैं। मैं एमएसवी का उपयोग कर रहा हूँ।

मैं सी, नहीं सी ++ का उपयोग करता हूं। मुझे पता है कि मैं सी ++ में प्रारंभिक सूची का उपयोग कर सकता हूं।

सी में ऐसा कैसे करें?

+2

जिज्ञासा से, आपको एनआईएल_टी के लिए मूल्य और एनआईएल के लिए एक सूचक दोनों की आवश्यकता क्यों है? यह थोड़ा अनावश्यक लगता है। स्वतंत्र रूप से, यह एक दिलचस्प सवाल है! – templatetypedef

+0

सही। आप सी ++ का उपयोग नहीं कर रहे हैं, यही कारण है कि आप ऐसा नहीं कर सकते हैं। –

उत्तर

21

आप C99 का उपयोग कर रहे हैं, तो आप निर्दिष्ट कर सकते हैं इस्तेमाल किया initializers यह करने के लिए। मैंने जीसीसी पर इसका परीक्षण किया है और ऐसा लगता है कि यह ठीक काम करता है।

+1

+1 यह वास्तव में एक अच्छा मैक्रो के लिए बना देगा: '# परिभाषित करें TreeDecl (आईडी, आरटी) संरचना वृक्ष id = {.root = rt, .NIL = और id.NIL_t}' –

+4

सी 8 9 में आप 'स्ट्रिंग ट्री टी = {NULL, {0}, और t.NIL_t}; 'जब तक 0 संरचना नोड में पहले फ़ील्ड के लिए वैध प्रारंभकर्ता है। –

+0

या, @ क्रिस डॉड की टिप्पणी से निम्नलिखित पर, आप संरचना को पुनर्व्यवस्थित कर सकते हैं ताकि 'NIL' सदस्य 'NIL_t' सदस्य से पहले आया हो, फिर' स्ट्रक्चर ट्री टी = {NULL, और t.NIL_t} का उपयोग करें;' – caf

1

एक संरचना डेटा टेम्पलेट को परिभाषित करती है लेकिन इसमें कोई डेटा नहीं है। चूंकि इसमें कोई डेटा नहीं है, इसलिए इसे प्रारंभ करने का कोई तरीका नहीं है।

दूसरी ओर, यदि आप एक उदाहरण घोषित करना चाहते हैं, तो आप इसे प्रारंभ कर सकते हैं। हालांकि

struct Tree t = { .root = NULL, .NIL = &t.NIL_t }; 

C99 में यह केवल काम करता है,:

struct Tree t = { NULL, NULL, NULL }; 
+1

'NIL_t' एक 'स्ट्रक्चर नोड' है, न कि 'स्ट्रक्चर नोड *', इसलिए शायद इसे 'न्यूल' के रूप में प्रारंभ नहीं किया जाएगा। मैं इस प्रकार की तरह करने के लिए 'स्ट्रक्चर ट्री * इनिट (...)' फ़ंक्शन (या 'शून्य इनिट (स्ट्रक्चर ट्री * टी, ...)' फ़ंक्शन यदि आप पसंद करते हैं, या मैक्रो) बनाने की भी सिफारिश करेंगे। आप के लिए काम करता हूं। –

+0

@ क्रिस: ठीक है आप हैं। उसे याद किया होगा। मुझे लगता है कि आप दोनों घोषित किए जाने के बाद शायद ही किसी अन्य संरचना को संरचना सौंप सकते हैं। –

+0

@ जोनाथन - नेस्टेड 'स्ट्रक्चर' के लिए आप 'स्ट्रक्चर ट्री टी = {एनयूएलएल, {/ * स्ट्रक्चर नोड सामग्री * /}, न्यूल}' (या पिछले एक के लिए '& t.NIL_t') का उपयोग कर सकते हैं। –

0

शायद ऐसा कुछ पर्याप्त होगा?

struct { 
    struct Node * const NIL; 
    struct Node *root; 
    struct Node NIL_t; 
} Tree = {&Tree.NIL_t}; 
संबंधित मुद्दे