【问题标题】:Increasing stack not working增加堆栈不起作用
【发布时间】:2011-05-17 15:23:36
【问题描述】:

如何使用 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";

一遍又一遍

【问题讨论】:

  • 您是如何实现这些算法的?一个正确的冒泡排序实现不应该是递归的,一个正确的递归快速排序实现应该需要调用堆栈上的平均 O(lg n) 深度(如果您未能选择好的枢轴值或者您确实拥有最坏情况下的空间复杂度在技术上是线性的)反常数据)。如果使用递归算法的堆栈空间不足,最好的办法是以迭代形式重新实现它,或者使用可以在堆上分配的自己的堆栈来伪造递归。
  • 我认为我做了正确的冒泡排序。我今天刚学的快速排序,所以我不太确定。在我的硬件说明中,它明确表示我需要更改堆栈
  • 您展示的函数绝不会导致您的堆栈空间不足。它们都没有调用任何函数,也没有在堆栈上分配任何大对象。
  • 请注意,v_bubble 即使对于少量元素也不会给出正确的结果,并且它不能正确处理空的std::vector
  • 哎呀。你知道什么是崩溃吗?我非常怀疑它是显示完成排序需要多长时间的代码部分

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


【解决方案1】:

除非您正在为内存非常有限的嵌入式环境进行编程,否则我怀疑您的排序实现中存在递归错误,导致堆栈溢出。除非您正在处理真正巨大(许多 GB)的数组,否则无需更改堆栈大小。

想发布一些代码吗?

【讨论】:

    【解决方案2】:

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

    请同时发布您的main()

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

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

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

    【讨论】:

    • 我将如何解决这个问题?我会给数组一个很大的初始大小吗?
    • @calccrypto:不,你没有返回数组;您正在返回数组的 size-th 元素;由于索引 size 处没有元素(根据定义),因此结果未定义。
    • 我的 a_bubble 现在好点了吗?至于我正在运行的程序,我只需按下“构建并运行”按钮。这是屏幕上唯一的错误。
    • 是的,但它会在一段时间后失败。它运行了 32k 列表的所有 4 种排序,但在第二个 64k 排序时失败:使用数组进行快速排序。恐怕我不知道如何更改 a_quick
    • 等一下……它正在运行,但在完成 128k 排序后它并没有停止。奇怪
    猜你喜欢
    • 2010-11-24
    • 2011-11-20
    • 2015-11-22
    • 1970-01-01
    • 2014-04-06
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多