У меня есть алгоритм для создания сита Эратосфена и извлечения из него простых чисел. Он позволяет вам ввести максимальное значение для сита, а алгоритм дает вам простые числа ниже этого значения и сохраняет их в массиве в стиле c.
Проблема:
Все отлично работает со значениями до 500.000, однако, когда я ввожу большое значение во время работы, в 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.)
Моей первой идеей было то, что я не использовал достаточно большие переменные, но поскольку я использую «unsigned long long int», это не должно быть проблемой. Также отладчик указывает мне на точку в моем коде, где точке в массиве присваивается значение.
Поэтому мне интересно, есть ли максимальный предел для массива? Если да: я должен использовать NSArray вместо этого? Если нет, то что вызывает эту ошибку на основании этой информации?
EDIT:
Вот как выглядит код (он не завершен, поскольку он завершается с ошибкой в последней опубликованной строке). Я использую сборщик мусора.
/*--------------------------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;
}
Как вы можете видеть или не видеть, я новичок. Любые другие предложения приветствуются, конечно:)