मेरे पास एराटोस्टेनेस की चलनी बनाने और इससे प्राइम खींचने के लिए एक एल्गोरिदम है। यह आपको चाकू के लिए अधिकतम मान दर्ज करने देता है और एल्गोरिदम आपको उस मान से नीचे की कीमत देता है और इन्हें सी-स्टाइल सरणी में संग्रहीत करता है।"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;
}
जैसा कि आप देख सकते हैं या नहीं देख सकते हैं, यह है कि मैं हर एक शुरुआत कर रहा हूं। पाठ्यक्रम के किसी भी अन्य सुझाव का स्वागत है :)
यदि आप कोड पोस्ट करते हैं तो इसे डीबग करना अधिक आसान होगा। –