2010-05-14 14 views
6

मैं स्तरों की एक सरणी के साथ नामित खेल एक struct, इस तरह परिभाषित किया गया है:विभाजन गलती समस्या (सी)

typedef struct 
{ 
    Level levels[x]; 
} Game; 

जब मैं कोड संकलन, अगर एक्स 1, 2 या 3, कार्यक्रम रन है सामान्य रूप से। यदि यह कोई अन्य मूल्य है (उदाहरण के लिए, 4), मुझे एक सेगमेंटेशन गलती मिलती है। मैं कहीं भी सरणी तक नहीं पहुंच रहा हूं। मुख्य इस समय कुछ ऐसा है (प्रारंभिक को छोड़कर सब कुछ टिप्पणी की गई):

int main (...) 
{ 
    Game g; 

    return 0; 
} 

यह क्या हो सकता है इसका कोई संकेत?

अग्रिम धन्यवाद।

+3

क्या हम कृपया देख सकते हैं कि 'स्तर' क्या है, या कम से कम इसका आकार स्थिर आवंटन तक जाता है? मेरे पास एक बड़ा हिस्सा है। –

उत्तर

4

Level कितना बड़ा है? क्या यह संभव है कि आप अपने ढेर से बह रहे हैं? यह देखते हुए कि वहाँ (जाहिरा तौर पर) ही कभी एक खेल वैसे भी वस्तु, शायद आप, static भंडारण वर्ग का उपयोग कर के रूप में में बेहतर होगा: static Game g;

संपादित करें: आप ढेर पर आवंटन के लिए मजबूर करना चाहते हैं, मैं था सीधे पॉइंटर्स का उपयोग करने के बजाय std::vector<Level> levels; का उपयोग करने की सलाह दें। ओह - इसे याद किया जा रहा है सी, सी ++ नहीं।

+2

मैं इस बात से सहमत हूं कि वह शायद ढेर से बह रहा है, लेकिन सवाल सी ++ नहीं है :) –

+0

या आप मुख्य() फ़ंक्शन के बाहर जी की घोषणा को स्थानांतरित कर सकते हैं। –

+0

सुझाव के लिए धन्यवाद। मैंने अभी स्थिर का उपयोग किया क्योंकि मेरे पास केवल एक वस्तु है और यह इस तरह से काम करता है।इस कार्यक्रम ने मेरे कंप्यूटर पर सेगमेंटेशन गलती नहीं की, लेकिन उस समय मैं उस समय का उपयोग कर रहा था (यह वास्तव में पुराना है इसलिए शायद समस्या थी)। स्तर एक बड़ी कक्षा है लेकिन मुझे लगता है कि यह किसी सेगमेंटेशन गलती का कारण नहीं बनता है। – user228938

5

हैं स्तर वर्ग/struct वास्तव में बड़ा है, तो आप इस का उपयोग कर की कोशिश कर सकते:

typedef struct { 
    Level *levels; 
} Game; 

और फिर malloc() या नए के साथ अपने स्तर को आवंटित किए जाएं। या यदि आप वास्तव में स्तरों की एक सरणी की जरूरत है: ऐसा नहीं है, जबकि

// Allocate levels 
int i; 
for(i=0;i<NUM_LEVELS;i++) { 
    gameStruct.levels[i] = (Level*)malloc(sizeof(Level)); 
    initLevelNum(gameStruct.levels[i], i); 
} 
4

मेरी मशीन पर, इस कोड को

typedef struct { 
    char data[65536*4]; 
} Level; 

typedef struct 
{ 
    Level levels[4]; 
} Game; 

int main (...) 
{ 
    Game g; 

    return 0; 
} 

क्रैश,:

typedef struct { 
    Level* levels[NUM_LEVELS]; 
} Game; 

तो कुछ इस तरह से आवंटन का स्तर अगर मैं levels सरणी का आकार में बदलता हूं।

आप या तो चाहिए या ढेर पर अपने स्तरों डाल (ढेर के बजाय ढेर पर डेटा रख कर) अपने Level प्रकार के आकार को कम (उनमें संकेत की एक सरणी में रखकर गतिशील Level वस्तुओं आवंटित करने के लिए) ।

+0

आप स्तर को वैश्विक भी बना सकते हैं। शायद इस तरह से इस तरह प्रयोग नहीं किया जाता है कि यह एक समस्या होगी। – nategoose

0

यदि आपके पास वास्तव में आपके डेटा का आकार है और इसे आवंटित स्टैक पर जोर देने के लिए शायद लिंकर पर स्टैक आकार सेट करना एक विकल्प होगा। अगर मैं गलत हूँ मुझे सही करें मैं के रूप में इस विषय दिलचस्प

0

आमतौर पर, इसी तरह के मामलों में आप चर स्थिर घोषित करना चाहिए:

int main(void) { 
    static struct foo bar[SIZE]; 

    return 0; 
} 

इस प्रकार चर आवंटित किया गया है जाएगा और संकलित में स्थिर क्षेत्र में डाला पहर।

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