-1

インターウェブのどこかから取得したコードを使用して、基数ソート機能をプログラムに実装しようとしました。プログラムの入力は、約 120 万の long int を含むテキスト ファイルです。テキスト ファイルからの整数を格納する maxSize = 1200000 の配列が既にあるため、radixSort 関数で作業配列を作成すると、セグ フォールトが発生します。これを回避する方法はありますか?

ドライバーコードは次のとおりです。

case 5:
    //Sort using Radix Sort
    startTime = clock();

        radixSort(array, size);
        writeArray(radixFile, array, size);
        radixFile.close();

    endTime = clock();
    timeUsed = (endTime-startTime)/(double)CLOCKS_PER_SEC;
    cout << "Time elapsed: " << timeUsed << " seconds" << endl;
    break;

そしてここに関数があります

void radixSort(int *array,int size){

    int i,b[maxSize],m=0,exp=1;

    for(i=0;i<size;i++){
        if(array[i]>m)
            m=array[i];
    }

    while(m/exp>0)
    {
        int bucket[10]={0};

        for(i=0;i<size;i++)
            bucket[array[i]/exp%10]++;

        for(i=1;i<10;i++)
            bucket[i]+=bucket[i-1];

        for(i=size-1;i>=0;i--)
            b[--bucket[array[i]/exp%10]]=array[i];

        for(i=0;i<size;i++)
            array[i]=b[i];

        exp*=10;
    }
}

また、配列が作成される main の抜粋:

    int main(){

      int choice, size=0, x=0;
      int *array = NULL;
      array = new int[maxSize];

サイズが決定される場所:

void readArray(ifstream &inputFile, int arr[], int &size){
size = 0;
while (inputFile >> arr[size]){
    size++;
}}
4

2 に答える 2

1

1200000intは少なくとも1200000*4/1024 ^ 2 = 4.7 MiBを必要とし、スタック上で配列を宣言していますが、スタックサイズには不十分な場合があります...

代わりに、ヒープ上でb []を宣言してみましたか?

試す

int *b = new int[maxSize];

それ以外の

int b[maxSize];
于 2012-11-25T02:39:23.107 に答える
0

ファイルを正しく読み取っていません。抽出演算子は常に指定したストリームを返すため、EOFをチェックする必要があります(http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/を参照)。ここでメモリが破損している可能性が高く、その後はすべての賭けが無効になります。試す:

while (!inputFile.eof() && size<maxSize)
{
     inputFile >> arr[size++];
}
于 2012-11-25T03:06:41.630 に答える