2012-09-29 39 views
6

मैं निम्नलिखित संघ है:सी में एक संघ के अंदर एक संरचना सदस्य का उपयोग कैसे करें?

union employee 
{ 
    char key; 

    struct manager 
    { 
     short int age; 
     float shares; 
     short int level; 
    }; 

    struct worker 
    { 
     short int age; 
     short int skill; 
     short int department; 
    }; 

} company[10]; 

मैं एक संरचना है जो संघ employee अंदर है के एक सदस्य कैसे उपयोग कर सकते हैं? मैं इस तरह से manager संरचना के age सदस्य पहुँचने का प्रयास किया:

company[i].manager.age

लेकिन मैं error C2039: 'manager' : is not a member of 'employee' मिलता है।

उत्तर

8

टैग घोषणा के बाद कुछ जोड़ें। शायद:

struct manager 
{ 
    short int age; 
    float shares; 
    short int level; 
} manager; 

साइड नोट: यदि आप संघ सही उपयोग नहीं कर रहे। कुंजी, यानी वह क्षेत्र जो आपको बताता है कि क्या आप किसी प्रबंधक से या केवल कार्यकर्ता के साथ काम कर रहे हैं, संघ के बाहर में संलग्न होना चाहिए। शायद:

struct employee { 
    char key; 

    union { 
     struct manager ...; 
     struct worker ...; 
    } u; 
}; 

dasblinkenlight के रूप में नोट, आप संघ के बाहर अपने प्रबंधक/कार्यकर्ता टैग की घोषणा कर सकता है।

+0

+1 'यूनियन' कुंजी के उपयोग के बारे में अवलोकन उत्कृष्ट है! आप यह उल्लेख करना चाह सकते हैं कि 'कार्यकर्ता' को 'कार्यकर्ता' और 'प्रबंधक 'के अंदर' प्रबंधक 'को देना आवश्यक नहीं है। – dasblinkenlight

+0

आह, अब मुझे एहसास हुआ कि मैंने वहां क्या किया ... मैं पूरी तरह से संघ का उपयोग करने के बिंदु से चूक गया। – amiregelz

2

बेनामी structs/यूनियन सी मानक का हिस्सा नहीं है, बल्कि एक बहुत व्यापक जीएनयू एक्सटेंशन नहीं है।

आपके विशेष उदाहरण में कुछ कंपाइलर्स (मुख्य रूप से जीसीसी) आपको प्रबंधक और कार्यकर्ता को अद्वितीय चर के माध्यम से एक्सेस करने की अनुमति देगा। company[i].shares या company[i].department, लेकिन company[i].age अस्पष्ट है और संकलक को पता नहीं चलेगा कि कौन सा मतलब है। आपका दृष्टिकोण है जो भी वैध सी

नहीं है वहाँ इस को हल करने के लिए दो तरीके हैं

union { 
     int num; 
     float num; 
} union_number; 

को परिभाषित करने की कोशिश कर के समान है।

क) struct (बुराई जीएनयू तरह से बाहर साझा किया विशेषताओं चलती, ऐसा नहीं करते कृपया, मैं एक तथ्य यह है कि आईसीसी भी इस संकलन नहीं है)

union employee 
{ 
    char key; 

    struct person { 
     short int age; 

     union { 
      struct manager 
      { 
       float shares; 
       short int level; 
      }; 

      struct worker 
      { 
       short int skill; 
       short int department; 
      }; 
     } 
    }; 

} company[10]; 

ख के लिए जानते हैं) या अधिक स्वच्छ मानकीकृत तरीका है अपने structs नाम के लिए:

union employee 
{ 
    char key; 

    struct manager 
    { 
     short int age; 
     float shares; 
     short int level; 
    } manager; 

    struct worker 
    { 
     short int age; 
     short int skill; 
     short int department; 
    } worker; 

} company[10]; 

इस मामले में आप company[i].manager.age, company[i].worker.skill और इतने पर के माध्यम से struct तत्वों उपयोग करने में सक्षम हो जाएगा।

कृपया ध्यान दें कि रनटाइम पर यह जांचने का कोई तरीका नहीं है कि आपके संघ में एक कुंजी, प्रबंधक या कार्यकर्ता है या नहीं। इसे पहले से ही जाना जाना चाहिए।

एक और बात: मुझे यकीन नहीं है कि यह इरादा है, लेकिन आपकी घोषणा में आप प्रबंधक या कार्यकर्ता के साथ एक कुंजी को सहेज नहीं सकते हैं। आपके यूनियन में केवल एक कुंजी, प्रबंधक या कार्यकर्ता

+0

हाँ, मुझे एहसास हुआ कि cnicutar के बाद बाहर की ओर इशारा किया।मैंने फिर इसे बदल दिया: 'स्ट्रक्चर कंपनी { \t चार कुंजी; \t संघ कर्मचारी \t { \t \t struct प्रबंधक \t \t { \t \t \t कम पूर्णांक उम्र; \t \t \t फ्लोट शेयर; \t \t \t लघु int स्तर; \t \t} प्रबंधक; \t \t struct कार्यकर्ता \t \t { \t \t \t कम पूर्णांक उम्र; \t \t \t लघु int कौशल; \t \t \t लघु int विभाग; \t \t} कर्मचारी; \t} कर्मचारी; } comp [10]; ' – amiregelz

+0

बेनामी संरचना और संघ के सदस्य पूरी तरह से मानक सी 11 हैं, वास्तव में। – 00dani

0

यह त्रुटि इसलिए है क्योंकि आप संरचना तत्वों को स्वयं संरचना के नाम से एक्सेस करने का प्रयास कर रहे हैं, जो मान्य नहीं है। संरचना के तत्वों तक पहुंचने के लिए, पहले इसे किसी ऑब्जेक्ट को बनाना चाहिए।

निम्नलिखित कोड में प्रबंधन और कार्यकर्ता क्रमशः संरचना प्रबंधक और कार्यकर्ता की वस्तुएं हैं।

यूनियन कर्मचारी { चार कुंजी;

struct manager 
{ 
    short int age; 
    float shares; 
    short int level; 
}manage; 

struct worker 
{ 
    short int age; 
    short int skill; 
    short int department; 
}work; 

} कंपनी [10];

अब

सदस्य यू उपयोग कर सकते हैं का उपयोग करने के लिए "कंपनी [i] .manage.age"

0

आप सदस्यों जिस तरह से आप कोशिश कर रहे हैं का उपयोग कर सकते, (लेकिन संरचनाओं जो संघ के अंदर हैं अद्वितीय सदस्यों होना चाहिए), लेकिन क्या आप वाकई कोड संयोजित करते समय जीसीसी पता होना चाहिए कि यह है कि आप इस तरह की कोशिश कर रहे बनाना चाहिए,

आदेश: gcc -fms-extensions file_name.c जो C11 से समर्थन करता है।

चाहते:

union employee 
{ 
char key; 

struct manager 
{ 
    short int age; 
    float shares; 
    short int level; 
}; 

struct worker 
{ 
    short int age; 
    short int skill; 
    short int department; 
}; 
} company[10]; 

क्योंकि यह प्रबंधक और कार्यकर्ता के सदस्यों के बीच अस्पष्टता पाता है यह मूलतः संकलन त्रुटि देता है।

तो तुम करने के लिए अपने कोड परिवर्तित करते हैं:

union employee 
{ 
char key; 

struct manager 
{ 
    short int age; 
    float shares; 
    short int level; 
}; 

struct worker 
{ 
    short int age1; 
    short int skill; 
    short int department; 
}; 

} company[10]; 

वरना आप सीधे संघ के अंतर्गत रख सकते हैं।

जब तक आप -fms-extensions निर्दिष्ट करते समय इसे संकलित करते समय संकलन समय त्रुटियां प्रदान नहीं करेंगे।