Увеличение стека не работает - PullRequest
3 голосов
/ 30 ноября 2010

Как правильно увеличить стек, доступный для программы, использующей Bloodshed Dev C ++ или Code :: Block?Я запускаю простой пузырь и быстро сортирую эту работу, но когда я изменил стек в Code :: Block (узнал, как больше здесь ), это привело к сбою моей программы еще быстрее, несмотря на использование гораздо большего, чем предполагалось, места.Первоначально программа зависала при сортировке 64 КБ случайных целых чисел (используя функцию 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 тыс. записей, сортирует их с помощью приведенного выше кода и возвращает время.эта часть, я почти уверен, что я не облажался

моя основная часть в основном просто

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

снова и снова

Ответы [ 2 ]

6 голосов
/ 30 ноября 2010

Если вы не программируете для встроенной среды с очень ограниченными памятью, я подозреваю, что в ваших реализациях сортировки есть ошибка рекурсии, которая вызывает переполнение стека. Изменение размера стека не требуется, если вы не имеете дело с действительно огромными (много ГБ) массивами.

Хотите отправить код?

1 голос
/ 30 ноября 2010

В функции int a_bubble(int array[], int size): вы возвращаете array[size], то есть вне предела. То же самое верно для a_quick().

И отправьте также свой main(), пожалуйста.

РЕДАКТИРОВАТЬ: нет, он возвращает элемент, который после последний элемент массива. Некоторые могут сказать, что даже доступ к нему - UB, и они были бы правы.

Это отладочная сборка, которую вы запускаете? Я думаю, что код ошибки соответствует «исключению вне пределов», но я не понимаю, почему он должен быть настолько загадочным.

РЕДАКТИРОВАТЬ2: это хуже. Что означает int array[1 << 20]? Старая версия была в порядке, вам просто нужно было удалить return array[size]. Сделайте функции, возвращающие void, у вас уже есть и массив, и его размер в вызываемом объекте.

...