2010-06-16 6 views
5

मेरे पास एराटोस्टेनेस की चलनी बनाने और इससे प्राइम खींचने के लिए एक एल्गोरिदम है। यह आपको चाकू के लिए अधिकतम मान दर्ज करने देता है और एल्गोरिदम आपको उस मान से नीचे की कीमत देता है और इन्हें सी-स्टाइल सरणी में संग्रहीत करता है।"EXC_BAD_ACCESS: पहले चयनित फ्रेम को पुनर्स्थापित करने में असमर्थ" त्रुटि, ऐरे आकार?

समस्या: सब कुछ 500,000 अप करने के लिए मूल्यों के साथ ठीक काम करता है, लेकिन जब मैं में प्रवेश एक बड़े मूल्य running- -while यह मेरे xcode में निम्न त्रुटि संदेश देता है:

Program received signal: “EXC_BAD_ACCESS”. 
warning: Unable to restore previously selected frame. 
Data Formatters temporarily unavailable, will re-try after a 'continue'. (Not safe to call dlopen at this time.) 

मेरा पहला विचार यह है कि मैं था बड़े पर्याप्त चर का उपयोग नहीं किया, लेकिन जैसा कि मैं 'हस्ताक्षरित लंबे लंबे int' का उपयोग कर रहा हूं, यह समस्या नहीं होनी चाहिए। इसके अलावा डीबगर मुझे मेरे कोड में एक बिंदु पर इंगित करता है जहां सरणी में एक बिंदु एक मान असाइन किया जाता है। इसलिए मुझे आश्चर्य है कि सरणी की अधिकतम सीमा है? यदि हां: क्या मुझे इसके बजाय एनएसएआरएआरई का उपयोग करना चाहिए? यदि नहीं, तो इस जानकारी के आधार पर इस त्रुटि का कारण क्या है?

संपादित करें: यह कोड जैसा दिखता है (यह पूर्ण नहीं है, क्योंकि यह पोस्ट की गई अंतिम पंक्ति में विफल रहता है)। मैं कचरा संग्रह का उपयोग कर रहा हूँ।

/*--------------------------SET UP--------------------------*/ 
    unsigned long long int upperLimit = 550000;    // 
    unsigned long long int sieve[upperLimit]; 
    unsigned long long int primes[upperLimit]; 
    unsigned long long int indexCEX; 
    unsigned long long int primesCounter = 0; 

// Fill sieve with 2 to upperLimit 
for(unsigned long long int indexA = 0; indexA < upperLimit-1; ++indexA) { 
     sieve[indexA] = indexA+2; 
} 


unsigned long long int prime = 2; 

/*-------------------------CHECK & FIND----------------------------*/ 
while(!((prime*prime) > upperLimit)) { 

    //check off all multiples of prime 
    for(unsigned long long int indexB = prime-2; indexB < upperLimit-1; ++indexB) { 

     // Multiple of prime = 0 
     if(sieve[indexB] != 0) { 
      if(sieve[indexB] % prime == 0) { 
       sieve[indexB] = 0; 
      } 
     } 
    } 

    /*---------------- Search for next prime ---------------*/ 
    // index of current prime + 1 
    unsigned long long int indexC = prime - 1; 

    while(sieve[indexC] == 0) { 
     ++indexC; 
    } 
    prime = sieve[indexC]; 

    // Store prime in primes[] 
    primes[primesCounter] = prime; // This is where the code fails if upperLimit > 500000 
    ++primesCounter; 

    indexCEX = indexC + 1; 

} 

जैसा कि आप देख सकते हैं या नहीं देख सकते हैं, यह है कि मैं हर एक शुरुआत कर रहा हूं। पाठ्यक्रम के किसी भी अन्य सुझाव का स्वागत है :)

+1

यदि आप कोड पोस्ट करते हैं तो इसे डीबग करना अधिक आसान होगा। –

उत्तर

7

आप चर को बहते नहीं हैं; आप ढेर बह रहे हैं। जब आप int myArray[500] जैसे सरणी बनाते हैं, तो आप स्टैक पर 500 int एस घोषित कर रहे हैं। सामान्य ढेर आकार 8 एमबी है। आपके दो सरणी अकेले 8.4 एमबी (8 बाइट्स * 550000/(1024^2) = 4.2 एमबी) हैं। आपको इसके बजाय हीप मेमोरी (malloc() से) का उपयोग करना चाहिए। तो यह इस तरह होगा:

int upperLimit = 550000; 
unsigned long long *sieve = malloc(sizeof(long long) * upperLimit); 
unsigned long long *primes = malloc(sizeof(long long) * upperLimit); 
unsigned long long indexCEX; 
unsigned long long primesCounter = 0; 

मत भूलना कि तुम जब आप इसे पूरा कर चुके हैं या आप लीक पहुंच जाएंगे free() को स्मृति की आवश्यकता होगी।

+0

बहुत बहुत धन्यवाद! यह काम किया :) – Job

0

जैसा कि मुझे पता है, "EXC_BAD_ACCESS" प्राप्त होता है, जब आप पहले से ही मुक्त स्मृति के साथ काम करने का प्रयास करते हैं। इसे डीबग करने के लिए आप NSZombie क्लास का उपयोग कर सकते हैं। इससे मदद मिल सकती है: http://www.cocoadev.com/index.pl?DebuggingAutorelease

+0

यह मेरे कोड के लिए प्रासंगिक नहीं है क्योंकि मैं कचरा संग्रह का उपयोग कर रहा हूं। वैसे भी धन्यवाद :) – Job

2

आप ढेर पर आवंटित सरणी का उपयोग कर रहे हैं। आप शायद अधिक स्मृति alloc अगर आप गतिशील स्मृति आवंटन का उपयोग कर सकते हैं:

/* program setup */ 
unsigned long long *sieve = malloc(sizeof(*sieve) * upperLimit); 
unsigned long long *primes = /* -- "" -- */ 
/* etc, free() at program end */ 

अपने ओएस एक्स सिस्टम पर ढेर सीमा शायद 8 MiB है। यदि आपके सिस्टम पर sizeof(unsigned long long) == 8 है, तो आप अपने स्टैक में दो 500000-तत्व सरणी फिट करेंगे, लेकिन दो 550000-तत्व सरणी नहीं।

0

मुझे यह समस्या भी थी। बाहर निकलता है मैं लूप था। मैं दुर्घटना से खुद के भीतर से एक विधि बुला रहा था।

+0

क्या आप कुछ और विवरण या उदाहरण दे सकते हैं? – Foo

+0

ओए ... यह एक साल पुराना है। दुर्भाग्य से मुझे याद भी नहीं है। लेकिन यदि आप - (शून्य) विधि {[स्वयं विधि]; } –

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