2013-02-24 96 views
-1

完成修復錯誤後,我運行程序,它崩潰了。試圖修復程序一段時間,但couldn't.The程序是關於序列和排序。編譯器是devcpp.Seems不完全是堆棧溢出。 :)程序崩潰序列排序程序

#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--; 
     } 
    } 
} 
+1

你的縮進只是醜陋的。 – ogzd 2013-02-24 21:40:15

+3

@ogzd新用戶可能沒有完全意識到如何縮進他們的問題;我想這是編輯和編輯的重點。 – Rubens 2013-02-24 21:41:40

+0

這確實很難閱讀。什麼是確切的錯誤?你在使用什麼平臺? gdb說什麼?據我所知,devcpp是一個IDE,而不是編譯器。 – 2013-02-24 21:42:23

回答

2

您正在定義一個變量爲N大小的數組。 使用此insted的:

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

第二個問題是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 
} 
+0

使用單位變量N size – qPCR4vir 2013-02-24 21:44:13

+0

N未初始化,因此它仍會與此代碼一起崩潰。 – judda 2013-02-24 21:45:26

+0

......它們被稱爲可變長度數組,因爲它是有效的,所以很多C++編譯器都支持它們。C++可能會在十年結束之前引入它,但我希望它們不要!無論如何,如果編譯器不支持它,它會在編譯時出錯,而不是在運行時。編輯:當然,N應該被初始化。 – 2013-02-24 21:46:52

2

您正試圖訪問您不屬於自己的內存。

int N; 
int a[ N ]; 

您聲明N和然後用它定義你的陣列,但在那個時間點上還沒有被初始化。然後當你嘗試寫入內存中的位置時,它會發生故障。

+2

誰說那個時候'N == 0'?我認爲它是未初始化的,這意味着它可以有*任何*值。 – leemes 2013-02-24 21:47:33

+0

你說得對。它是未初始化的,所以它可以是任何東西 – judda 2013-02-24 21:48:21

+0

謝謝,修復它。 :) – user2105426 2013-02-24 21:50:35