增加堆栈不工作

时间:2010-11-30 02:43:06

标签: c++ sorting compiler-construction stack bubble-sort

如何使用Bloodshed Dev C ++或Code :: Block正确增加程序可用的堆栈?我运行简单的泡泡和快速排序工作,但当我在Code :: Block中更改堆栈(发现如何超过here)它使我的程序崩溃更快,尽管使用了超过建议的空间。最初,程序在排序64K随机整数时崩溃(使用rand()函数)。现在,它崩溃在32K。我得到错误:Process returned -1073741571 (0xC00000FD)

程序实际上运行得更快,而不会更改堆栈,假设即时通讯正确。 gcc -Wl,--stack,1099511627776

我无法弄清楚如何在Dev C ++中改变它

我该怎么办? 有没有办法在代码本身内更改堆栈? 这是我用于泡泡和快速排序的代码。每个都有两个:一个是矢量,另一个是数组。我认为泡沫排序。应该是正确的。快速排序,我不太确定。抱歉,如果它有点凌乱

vector <int> v_bubble(vector <int> array){
    // Vector Bubble Sort
    if (array.size() < 2){
        return array;
    }
    int s = 1;
    while (s){
        s = 0;
        for (unsigned int x = 0; x < (array.size() - 1); x++){
            if (array[x] > array[x + 1]){
                int t = array[x];
                array[x] = array[x + 1];
                array[x + 1] = t;
                s = 1;
            }
        }
    }
    return array;
}

void a_bubble(int array[], int size){
    // Array Bubble Sort
    int s = 1;
    while (s){
        s = 0;
        for (int x = 0; x < (size - 1); x++){
            if (array[x] > array[x + 1]){
                int t = array[x];
                array[x] = array[x + 1];
                array[x + 1] = t;
                s = 1;
            }
        }
    }
}

vector <int> v_quick(vector <int> array){
    //Vector Quick Sort
    if (array.size() < 2){
        return array;
    }
    vector <int> left;
    vector <int> right;
    int p_location = array.size() / 2 - 1;
    int pivot = array[p_location];
    for(unsigned int x = p_location; x < array.size() - 1; x++){
        array[x] = array[x + 1];
    }
    array.pop_back();
    for(unsigned int x = 0; x < array.size(); x++){
        if (array[x] <= pivot) {
            left.push_back(array[x]);
        }
        else if (array[x] > pivot){
            right.push_back(array[x]);
        }
    }
    vector <int> p;
    p.push_back(pivot);
    return combine(combine(v_quick(left), p), v_quick(right));
}

int a_quick(int array[], int size, int l_index = -1, int r_index = -1){
    //Array Quick Sort
    if (size < 2){
        return array[size];
    }
    array[size] = array[size];
    int left[size];
    int right[size];
    l_index = 0;
    r_index = 0;
    int p_location = size / 2 - 1;
    int pivot = array[p_location];
    for(int x = p_location; x < size - 1; x++){
        array[x] = array[x + 1];
    }
    size--;
    for(unsigned int x = 0; x < size; x++){
        if (array[x] <= pivot) {
            left[l_index] = array[x];
            l_index++;
        }
        else if (array[x] > pivot){
            right[r_index] = array[x];
            r_index++;
        }
    }
    return a_quick(left, l_index, l_index, r_index) + pivot + a_quick(right, r_index, l_index, r_index);
}

其余代码只是生成包含32,64和128 k条目的数组和向量,使用上面的代码对它们进行排序并返回时间。那部分我很确定我没搞砸了

我的主要基本上只是

    start = clock();
    a_quick(array1, 32000);
    end = clock();
    cout << "\nQuick Sort\tArray\t32000\t" << ((double) end - start)/CLOCKS_PER_SEC << " seconds\n";

一遍又一遍

2 个答案:

答案 0 :(得分:6)

除非你是为一个内存受限的嵌入式环境编程,否则我怀疑你的排序实现中有一个导致堆栈溢出的递归错误。除非您正在处理真正庞大的(许多GB)数组,否则不必更改堆栈大小。

小心发布一些代码?

答案 1 :(得分:1)

在函数int a_bubble(int array[], int size)中:返回array[size],这是超出范围的。 a_quick()也是如此。

并发布您的main()

编辑:不,它返回之后的元素数组的最后一个元素。有人可能会说,即使访问它是UB,他们也是对的。

您正在运行的调试版本吗?我认为错误代码对应于“出界异常”,但我不明白为什么它必须如此神秘。

EDIT2:情况更糟。 int array[1 << 20]代表什么?旧版本没问题,您只需删除return array[size]即可。使函数返回void,你已经在被调用者中同时拥有数组及其大小。