2011-03-02 13 views
11

मैं एक स्ट्रक्चर में दो एरे रखना चाहता हूं, जो शुरुआत में शुरू किए गए हैं लेकिन आगे संपादन की आवश्यकता है। मुझे संरचना के तीन उदाहरणों की आवश्यकता है, ताकि मैं एक विशिष्ट संरचना में अनुक्रमणित कर सकूं और जैसा चाहूं संशोधित कर सकूं। क्या यह संभव है?सी स्ट्रक्चर में एरे

यह मैंने सोचा था कि मैं क्या कर सकता है, लेकिन मैं त्रुटियों मिलता है:

struct potNumber{ 
    int array[20] = {[0 ... 19] = 10}; 
    char *theName[] = {"Half-and-Half", "Almond", "Rasberry", "Vanilla", …}; 
} aPot[3]; 

तब मैं structs के रूप में इस का उपयोग:

printf("some statement %s", aPot[0].array[0]); 
aPot[0].theName[3]; 
… 
+6

आपको क्या त्रुटियां मिलती हैं? –

+3

क्या वाकई आपकी 'संरचना' को परिभाषित किया गया है? – birryree

उत्तर

11

struct खुद को डेटा नहीं है। तुम इतनी char *theNames[] मान्य नहीं है, एक निश्चित आकार होना आवश्यक है struct प्रकार की वस्तुओं को बनाने और वस्तुओं निर्धारित करने की आवश्यकता ...

struct potNumber { 
    int array[20]; 
    char *theName[42]; 
}; 

/* I like to separate the type definition from the object creation */ 
struct potNumber aPot[3]; 
/* with a C99 compiler you can use 'designated initializers' */ 
struct potNumber bPot = {{[7] = 7, [3] = -12}, {[4] = "four", [6] = "six"}}; 

for (i = 0; i < 20; i++) { 
    aPot[0].array[i] = i; 
} 
aPot[0].theName[0] = "Half-and-Half"; 
aPot[0].theName[1] = "Almond"; 
aPot[0].theName[2] = "Rasberry"; 
aPot[0].theName[3] = "Vanilla"; 
/* ... */ 

for (i = 0; i < 20; i++) { 
    aPot[2].array[i] = 42 + i; 
} 
aPot[2].theName[0] = "Half-and-Half"; 
aPot[2].theName[1] = "Almond"; 
aPot[2].theName[2] = "Rasberry"; 
aPot[2].theName[3] = "Vanilla"; 
/* ... */ 
+0

यह मत भूलना कि आप संरचनाएं शुरू कर सकते हैं; क्रैपी स्वरूपण का बहाना: संरचना potNumber aPot = {{[0] ... [1 9] = 10}, {"आधा और आधा", "बादाम", "रसबेरी", "वेनिला" .......}}; –

+0

@ डेविड: हाँ, '...' को छोड़कर, यह काम करता है। उदाहरण ऊपर मेरे स्निपेट में जोड़ा गया। धन्यवाद। – pmg

+0

@ डेविड: वे बहुत ही जीसीसी-स्टाइल प्रारंभिक हैं (और चूंकि यह लिनक्स है, मैं जीसीसी मानता हूं)। मैंने कभी '......' सामान नहीं देखा है, क्या यह वैध भी है? – birryree

9

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

struct का एक सही घोषणा के बाद

struct potNumber{ 
    int array[20]; 
    char theName[10][20]; 
}; 

कैसा लगेगा और आप इसे इस तरह से प्रारंभ:

struct potNumber aPot[3]= 
{ 
    /* 0 */ 
    { 
     {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 /* up to 20 integer values*/ }, 
     {"Half-and-Half", "Almond", "Raspberry", "Vanilla", /* up to 10 strings of max. 20 characters */ } 
    }, 
    /* 1 */ 
    { 
     {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 /* up to 20 integer values*/ }, 
     {"Half-and-Half", "Almond", "Raspberry", "Vanilla", /* up to 10 strings of max. 20 characters */ } 
    }, 
    /* 2 */ 
    { 
     {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10 /* up to 20 integer values*/ }, 
     {"Half-and-Half", "Almond", "Raspberry", "Vanilla", /* up to 10 strings of max. 20 characters */ } 
    } 
}; 

लेकिन, मुझे यकीन है कि यह नहीं है कि आप क्या चाहते हूँ।

struct IntArray 
{ 
    size_t elements; 
    int *data; 
}; 

struct String 
{ 
    size_t length; 
    char *data; 
}; 

struct StringArray 
{ 
    size_t elements; 
    struct String *data; 
}; 
/* functions for convenient allocation, element access and copying of Arrays and Strings */ 

struct potNumber 
{ 
    struct IntArray array; 
    struct StringArray theNames; 
}; 

व्यक्तिगत तौर पर मैं दृढ़ता से नग्न सी सरणियों का उपयोग कर के खिलाफ सलाह: यह करने के लिए समझदार तरीका कुछ बॉयलरप्लेट कोड की आवश्यकता है। सहायक स्ट्रक्चर और कार्यों के माध्यम से सबकुछ करना आपको बफर से नीचे/ओवररन्स और अन्य परेशानी से साफ़ करता है। प्रत्येक गंभीर सी कोडर एक समय-समय पर सामान के साथ एक वैकल्पिक कोड लाइब्रेरी बनाता है।

+2

ठीक आपकी मदद के लिए धन्यवाद, क्या आप मुझे एक उदाहरण दे सकते हैं कि मैं डेटा कैसे दर्ज करूंगा, और फिर मैं इसे कैसे एक्सेस कर पाऊंगा? – Greg

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