Загрузка...

Помогите

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

  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. Посмотреть предыдущие комментарии (5)
    2. impelix Автор темы
      vtlstolyarov, когда генеришь массив 10в9 он выдает ошибку 'terminate called after throwing an instance of 'std::bad_alloc'
      what(): std::bad_alloc' Но при этом когда 10в8 он это делает спокойно
    3. 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
Загрузка...