-1

エラーの修正を終えた後、プログラムを実行してクラッシュしました。しばらくの間プログラムを修正しようとしましたが、できませんでした。プログラムはシーケンスとソートに関するものです。コンパイラはdevcppです。スタックオーバーフローではないようです。:)

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip> 
#include <conio.h>

using namespace std;

void selectionSort(int *, int);

int main()
{
    int N;
    int a[ N ];

    cout << "\n Enter the length of sequence:";
    cin >> N;

    for (int i = 0; i < N && i < 5; ++i)
    {
        a[ N ] = rand() % 1000000 + 0;
        srand(time(0));
        cout << "Random sequence";
        for (int i = 0; i < N; i++)
            cout << setw(4) << a[i];
        cout << endl;
    }

    cout << "Sorted sequence";
    selectionSort(a, N);
    for (int j = 0; j < N; j++)
        cout << setw(4) << a[j];
    cout << endl;
    getch();
}

void selectionSort(int *array, int N)
{
    int temp, i, j;
    for (i = 0; i < N - 1; i++)
    {
        j = i;
        while (j > 0 && array [j - 1] > array [j])
        {
            temp = array [j];
            array[j] = array [j - 1];
            j--;
        }
    }
}
4

2 に答える 2

2

N可変サイズの配列を定義しています。このinstedを使用してください:

int *a = new int[N];
// ...
delete [] a;

2番目の問題はa[N] = ...、存在しない要素へのアクセスです。

また、srand(time(0));ループではなく、コードの先頭に配置することをお勧めします。

int main()
{
    srand(time(0));

    int N;
    cout << "\n Enter the length of sequence:";
    cin >> N;

    int *a = new int[N]; // If you compiler support you can: int a[N];

    for (int i = 0; i < N; ++i)
    {
        a[ i ] = rand() % 1000 + 0;
    }

    cout << "Random sequence";
    for (int j = 0; j < N; j++)
        cout << setw(4) << a[j];
    cout << endl;


    cout << "Sorted sequence";
    selectionSort(a, N);
    for (int j = 0; j < N; j++)
        cout << setw(4) << a[j];
    cout << endl;
    getch();

    delete [] a; // If you use pointer version
}
于 2013-02-24T21:42:38.800 に答える
2

所有していないメモリにアクセスしようとしています。

 int N;
 int a[ N ];

Nを宣言し、それを使用して配列を定義していますが、その時点ではまだ初期化されていません。次に、メモリ内のその場所に書き込もうとすると、セグメンテーション違反が発生します。

于 2013-02-24T21:43:10.023 に答える