tmp = pow(p[i],j);
コンパイラはwhilep[i]
でSIGSEGV をスローしj
、2 つの整数でありp[i]
、 array の有効な要素ですp
。理由は本当にわかりません...
元のコードはこちら: http://pastebin.com/DYhGeHxm
tmp = pow(p[i],j);
コンパイラはwhilep[i]
でSIGSEGV をスローしj
、2 つの整数でありp[i]
、 array の有効な要素ですp
。理由は本当にわかりません...
元のコードはこちら: http://pastebin.com/DYhGeHxm
次のことに気付きましたか。
int i,j,p[2000], a[5000000],num,count,tmp;
スタックスペースの瀬戸際にあなたを追い込んでいる可能性がありますか? あれは
4 + 4 + 8000 + 20000000 + 4 + 4 + 4
バイト
つまり、19.08 メガバイトのスタック空間宣言があります。a
少なくとも動的に割り当てることを検討してください。私がそれを次のように変更したとき:
int *a = malloc(5000000 * sizeof(*a));
コードを再実行すると、セグフォルトを大幅に回避できました。残念ながら、この場所で死亡しました。
count = 0;
for(i = 0; i < num; i++) {
for(j = 2; ;j++) {
tmp = pow(p[i],j);
if(tmp > 5000000) break;
a[count++] = tmp; // <=== faulted here, count was 5000193
}
}
の割り当てられた最大サイズに達すると、両方のループが壊れるはずですa[]
。私は次のことをしました。の上部main()
:
static const int a_max = 5000000;
int *a = malloc(a_max*sizeof(*a));
ループの中で:
count = 0;
for(i = 0; i < num && count < a_max; i++)
{
for(j = 2; count < a_max; j++)
{
tmp = pow(p[i],j);
if(tmp > 5000000)
break;
a[count++] = tmp;
}
}
これにより、すべてのセットアップが完了します。最後に、クイックソート アルゴリズム自体も壊れているように見えます。それをデバッグするには、小さいデータサイズから始めることを強くお勧めします。
幸運を祈ります。
編集参照用のクイックソートアルゴリズムが必要な場合に備えて、ジャンクフォルダーの1つにあるソースファイルに1つありました。それが正しいことを保証するものではありません(確かにそうであり、長さ1のソートもスキップします)が、ハングしないことはわかっているので、それはうまくいきます= P
// quicksort for ints
static void quicksort_ints(int *arr, int left, int right)
{
int p = (left+right)/2; // as good as any
int l = left, r = right; // movable indicies
while (l <= r)
{
while (arr[l] < arr[p])
++l;
while (arr[r] > arr[p])
--r;
if (l <= r)
{
int tmp = arr[l];
arr[l] = arr[r];
arr[r] = tmp;
++l;
--r;
}
}
if (left < r)
quicksort_ints(arr, left, r);
if (l < right)
quicksort_ints(arr, l, right);
}
の値を確認してくださいi
。p
配列に対して大きすぎる可能性があります。デバッガーでこれを行うことができます。