Tôi có một thuật toán để tạo rây Eratosthenes và kéo số nguyên tố từ nó. Nó cho phép bạn nhập giá trị tối đa cho rây và thuật toán cung cấp cho bạn số nguyên tố bên dưới giá trị đó và lưu trữ các giá trị này trong một mảng kiểu c."EXC_BAD_ACCESS: Không thể khôi phục khung đã chọn trước đó" Lỗi, kích thước mảng?
Vấn đề: Tất cả mọi thứ hoạt động tốt với các giá trị lên đến 500.000, tuy nhiên khi tôi nhập một giá trị lớn -while running- nó mang lại cho tôi được thông báo lỗi sau đây trong 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.)
ý tưởng đầu tiên của tôi là tôi không sử dụng các biến đủ lớn, nhưng khi tôi đang sử dụng 'unsigned long long int', điều này không phải là vấn đề. Ngoài ra, trình gỡ rối chỉ cho tôi một điểm trong mã của tôi, nơi một điểm trong mảng được gán một giá trị. Vì vậy, tôi tự hỏi là có một giới hạn tối đa cho một mảng? Nếu có: tôi có nên sử dụng NSArray thay thế không? Nếu không, thì điều gì gây ra lỗi này dựa trên thông tin này?
EDIT: Đây là mã trông như thế nào (nó không hoàn chỉnh, vì nó không thành công ở dòng cuối cùng được đăng). Tôi đang sử dụng bộ sưu tập rác.
/*--------------------------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;
}
Như bạn có thể thấy hoặc không thấy, là tôi rất - một người mới bắt đầu. Bất kỳ đề xuất nào khác đều được hoan nghênh tất nhiên :)
Sẽ dễ dàng hơn để gỡ lỗi này nếu bạn đăng mã. –