【发布时间】:2011-03-04 08:48:57
【问题描述】:
我有一个算法来创建 Eratosthenes 的筛子并从中提取素数。它允许您输入筛子的最大值,算法会为您提供低于该值的素数并将它们存储在 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 吗?如果不是,那么根据这些信息是什么导致了这个错误?
编辑: 这就是代码的样子(它不完整,因为它在发布的最后一行失败)。我正在使用垃圾收集。
/*--------------------------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;
}
正如您可能看到或可能没有看到的,我是 - 非常 - 一个初学者。当然欢迎任何其他建议:)
【问题讨论】:
-
如果你发布代码,调试起来会容易得多。
标签: c objective-c arrays xcode exception