Загрузка...

Help

Thread in C/C++ created by impelix Oct 7, 2022. 192 views

  1. impelix
    impelix Topic starter Oct 7, 2022 5 Nov 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
     
  2. vtlstolyarov
    vtlstolyarov Oct 8, 2022 468 Jan 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 тоже)
     
    1. View previous comments (1)
    2. vtlstolyarov
      impelix, так ты запускал этот кусочек кода что я тебе скинул (который только нарезает и удаляет массивы)? он работает?
    3. impelix Topic starter
      vtlstolyarov,
      terminate called after throwing an instance of 'std::bad_alloc'
      what(): std::bad_alloc
    4. impelix Topic starter
    5. View the next comments (3)
  3. LVV
    изменения с 4 на 8 (с помощью лонга) это не помогает при краше. тут выход за пределы из-за количества итераций (раз работа указателями) или памятью, а большое количество итераций это переполнение. и если не ошибаюсь уже само 10^8 это и есть переполнение инта не говоря уже о будущих операциях
     
    1. vtlstolyarov
      LVV, max int это 2,147,483,647 - то есть даже 10^9 это еще не переполнение, но он там местами умножает n на 10 и это уже даст переполнение поэтому я предложил сменить int на long. и я не совсем понимаю о каком переполнении количества итерации ты говоришь.
Top
Loading...