2015-04-24 11 views
6

मैं structs (आम तौर पर) को प्रारंभ करने के लिए कैसे पता है, लेकिन मैं एक struct सामान भीतरStruct प्रारंभ त्रुटि

typedef struct Location{ 
    uint8_t x; 
    uint8_t y; 
} loc; 

typedef struct Person{ 
    loc location; 
} person; 

वैश्विक चर इस struct के साथ समस्याएं हो रही हैं:

static person hero; 

प्रारंभ कार्य:

void InitializeHero() { 
    person hero = {0,0, {0,0}}; // this compiles 
    hero.location = {0,0}; // but this does not compile 
    hero = {0,0,{0,0}}; // this also does not compile 
} 
+1

हू? आपका पहला प्रारंभ * संकलन * नहीं करता है। आपके पास '{}' के अंदर 4 स्केलर हैं और संरचना में केवल 2 स्केलर सदस्य हैं। यह सी – AnT

+0

में एक त्रुटि है या अधिक डुप्लिकेट: http://stackoverflow.com/q/24138140/694576 – alk

+0

संभावित डुप्लिकेट [एएनएसआई सी में एक स्ट्रक्चर कैसे प्रारंभ करें] (http://stackoverflow.com/प्रश्न/330793/कैसे-से-प्रारंभिक-ए-स्ट्रक्चर-इन-ansi-c) – alk

उत्तर

3

आपकी 'यह संकलन' रेखा सही है; यह एक प्रारंभिक है। अन्य दो पंक्तियां संकलित नहीं होती हैं, क्योंकि वे प्रारंभिक नहीं हैं, वे असाइनमेंट हैं। आप सी का एक नया पर्याप्त संस्करण का उपयोग कर रहे हैं, तो आप कार्य करने के लिए एक यौगिक शाब्दिक इस्तेमाल कर सकते हैं:

hero.location = (loc){0,0}; 
hero = (person){0,0,{0,0}}; 

नोट - InitializeHero छाया वैश्विक चर में अपने person hero घोषणा; आप शायद यह नहीं चाहते हैं।

बीटीडब्ल्यू, क्या आप अपने person में कुछ फ़ील्ड खो रहे हैं? इसमें से कोई भी जो आपने दिखाया है उसके साथ संकलित होना चाहिए।

+0

हां मेरा बुरा। गायब फ़ील्ड के बारे में खेद है (क्या इन्हें स्केलर कहा जाता है?) – Justin

+0

इसके अलावा, यौगिक अक्षर का उद्देश्य क्या है? क्या वे स्पष्टता के लिए हैं? क्योंकि वे अनावश्यक – Justin

1

रेखा जो आप इंगित करते हैं कि संकलन एक चेतावनी उत्पन्न करता है। आइए आपके InitializeHero फ़ंक्शन को अलग करें।

person hero = {0,0, {0,0}};

यहाँ आप अपने नए person struct hero नामित instantiating कर रहे हैं। आप संरचना के सदस्यों को सेट करने के लिए ब्रेस प्रारंभिक विधि का उपयोग करते हैं। इस मामले में, person का एकमात्र सदस्य loc है। loc में केवल दो uint8_t एस हैं। यहां ब्रेस प्रारंभिक विधि का उपयोग करके, आप बस {0, 0} का उपयोग करेंगे।

person hero = {{0, 0}};

नोट है कि आप केवल ब्रेस आरंभीकरण उपयोग कर सकते हैं जब आरंभ:

इन दोनों का मेल, आप की तरह एक बयान लिख सकते हैं। आपके अन्य दो कथन असाइनमेंट हैं। इस बिंदु पर संरचना पहले ही शुरू हो चुकी है, यही कारण है कि उन दो बयान संकलित नहीं करते हैं।

एक अन्य ध्यान दें, अपने वैश्विक चर static person heroInitializeHero में स्थानीय चर hero द्वारा आच्छादित किया गया है। इसका मतलब है कि आप अपने InitializeHero में एक अलग person संरचना बना रहे हैं। बहरहाल, यह स्थिर चर जहां यह इस मामले में घोषित किया जाता है आरंभ नहीं हो जाता है, तो आपके बयान

static person hero = {{0, 0}};

... छोड़ने InitializeHero अप्रयुक्त अवश्य पढ़ें।

+1

प्रतीत होते हैं कि फ़ंक्शन का अभी भी एक उद्देश्य होगा यदि यह वैश्विक चर सेट करता है (और इसलिए स्थानीय चर घोषित नहीं किया गया है)। आपको कभी-कभी वैश्विक वैरिएबल को फिर से शुरू करने की आवश्यकता होती है और ऐसा फ़ंक्शन उचित हो सकता है। –

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