2013-02-24 93 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