素数を生成unsigned int count
し、それらをグローバルに宣言された動的に割り当てられた配列に格納する素数ジェネレーターnumList globalPrimes
numList is just がありtypedef unsigned int *numList
ます。count の値が 0 の場合、それは無視され、count が 0 でない限り、以前に計算された素数の値が無視される値を超えるまで素数が計算さunsigned int until
れます。
numList getPrimes(unsigned int count, unsigned int until)
{
unsigned int i, j;
unsigned int p = 0;
char b=1;
if(globalPrimes==NULL)
{
b=0;
globalPrimes = calloc(count>0? count:until, sizeof(int));
if(globalPrimes==NULL)
return NULL;
}
globalPrimes[0]=2; //set first 2 prime #'s in list
globalPrimes[1]=3;
for(i=2, p=5; count!=0? (i<count):(globalPrimes[i-1]<=until); p+=2) //iterate until it finds every prime number. Increments p by 2 starting from the third prime
{
if(globalPrimes[i]!=0) //if the current prime was preordained (a value was set already) skip to the next prime
{
p=globalPrimes[i++];
continue;
}
else if(globalPrimes[i]==0) //if it is 0, allocate the extra memory and find next prime
{
if(b)
globalPrimes=(numList)realloc((void *)globalPrimes, sizeof(int)*((count==0)? (until):(count+1)));
b=0;
}
for(j=0; (p%globalPrimes[j]) && globalPrimes[j]*globalPrimes[j]<p; j++); //loop through all previous primes until past half of p
if(p%globalPrimes[j]) //if the prime is still not divisible by the previous prime
globalPrimes[i++]=p; // save as the next prime
}
globalPrimes[i]=0;
globalPrimes=(numList)realloc((void *)globalPrimes, (i+(i%2)+1)*sizeof(int));
return globalPrimes;
}
いくつかのテスト中に、奇妙なエラーが見つかりました。realloc
netBeans (gcc コンパイラ)の最後から 2 番目の行で、実行時例外のようなものと思われる「シグナル」が表示されます。ダイアログ ボックスには、エラーが SIGABRT であることが示され、デバッグ モードでない間はプログラムが中止されます。このエラーは、count が奇数の場合にのみ発生することがわかりました。常に偶数を渡すように realloc の引数を変更しても、まだエラーが発生します。しかし、count を変更して関数の先頭のみにすると、正常に動作します。この奇妙な詳細がこの奇妙な動作を引き起こす理由がわかりません。