Загрузка...

Помогите

Тема в разделе C/C++ создана пользователем impelix 7 окт 2022. 183 просмотра

  1. impelix
    impelix Автор темы 7 окт 2022 5 28 ноя 2021
    for (auto i = 4; i < 10; ++i)
    {

    auto n = pow(10, i);

    cout << "10^"<< i << endl;

    int *copy = new int[n];

    int *arr = new int[n];

    for (auto k = 0; k < n; ++k){
    arr[k] = copy[k] = rand() % (2147483647 + 2147483648);
    тут 4 разных алгоритма сортировки
    delete [] arr;
    delete [] copy;
    }
    И вот проблема в том что когда я начинаю создавать массив в 10^8 степени программа крашится, не могу понять почему, после каждой сортировки я приравниваю массив arr который уже отсортирован к его первоначальное версии в массиве copy
    Возникло необработанное исключение по адресу 0x75FFCC12 в ...: исключение Microsoft C++: std::bad_alloc по адресу памяти 0x00EFFC1C.
    Весь код https://pastebin.com/rB9uc84s
     
    7 окт 2022 Изменено
  2. vtlstolyarov
    vtlstolyarov 8 окт 2022 468 8 янв 2022
    ты пробовал просто создавать массивы, без сортировки? типа так
    C
    #include <iostream>
    #include <cmath>

    using namespace std;

    int main()
    {
    for (auto i = 4; i < 10; ++i)
    {
    long n = pow(10, i);
    cout << "10^"<< i << endl;

    int *copy = new int[n];
    int *arr = new int[n];

    delete [] arr;
    delete [] copy;
    }
    }
    кстати, да - в теории проблема может быть с переполнением инта - попробуй везде переменную n заменить с int на long, особенно в алгоритме combSort (и тип переменной gap тоже)
     
    8 окт 2022 Изменено
    1. Посмотреть предыдущие комментарии (4)
    2. vtlstolyarov
      impelix, ничего не понял
    3. impelix Автор темы
      vtlstolyarov, когда генеришь массив 10в9 он выдает ошибку 'terminate called after throwing an instance of 'std::bad_alloc'
      what(): std::bad_alloc' Но при этом когда 10в8 он это делает спокойно
    4. vtlstolyarov
      impelix, похоже что у тебя тупо не хватает памяти
  3. LVV
    изменения с 4 на 8 (с помощью лонга) это не помогает при краше. тут выход за пределы из-за количества итераций (раз работа указателями) или памятью, а большое количество итераций это переполнение. и если не ошибаюсь уже само 10^8 это и есть переполнение инта не говоря уже о будущих операциях
     
    8 окт 2022 Изменено
    1. vtlstolyarov
      LVV, max int это 2,147,483,647 - то есть даже 10^9 это еще не переполнение, но он там местами умножает n на 10 и это уже даст переполнение поэтому я предложил сменить int на long. и я не совсем понимаю о каком переполнении количества итерации ты говоришь.
Top
Загрузка...