0 / 0 / 0
Регистрация: 11.12.2018
Сообщений: 32
1

Массив большого размера не заполняется

11.12.2018, 06:51. Показов 1475. Ответов 3

Author24 — интернет-сервис помощи студентам
По заданию необходимо считать из файла значения массива и отсортировать слиянием (рекурсивный алгоритм). Количество элементов в массиве 106. На массивах меньшего размера программа работает нормально, но при таком размере вызывается исключение во время сортировки. Прошу помочь понять и исправить ошибку.
Скрин исключения:
Кликните здесь для просмотра всего текста
Массив большого размера не заполняется

Листинг:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#define _CRT_NO_SECURE_NO_WARNINGS
#include <cstdlib>
#include <fstream>
#include <iostream>
#include <ctime>
 
 
using namespace std;
 
void sortMerge(int*, int, int); //функция рекурсивной сортировки слиянием
 
int main()
{
    int length; //длина массива
    unsigned int start_time[2], end_time[2]; //переменные для хранения времени работы сортировок
 
    start_time[0] = clock();
    ifstream rfile("input.txt");
    rfile >> length;
    cout << length << endl;
    int *A = new int[length]; //рабочий массив
    for (int i = 0; i < length; i++)
    {
        rfile >> A[i];
    }
    end_time[0] = clock();
 
    start_time[1] = clock();
    sortMerge(A, 0, length-1);
    end_time[1] = clock();
 
    ofstream wfile("output.txt");
    wfile << "data readout: " << end_time[0] - start_time[0] << "ms\n";
    wfile <<"sorting time Merge: " << end_time[1] - start_time[1] << "ms";
    wfile.close();
}
 
void sortMerge(int *a, int l, int r)
{
    if (l == r) return; //границы сомкнулись
    int mid = (l + r) / 2; //определение середины массива
 
    //рекурсивный вызов сортировки каждой половины массива
    sortMerge(a, l, mid);
    sortMerge(a, mid + 1, r);
 
    int i = l; //начало первого пути
    int j = mid + 1; //начало второго пути
 
    int *temp = (int*)malloc(r * sizeof(int)); //создание дополнительного массива
    for (int stp = 0; stp < r - l + 1; stp++)
    {
        if ((j > r) || ((i <= mid) && (a[i] < a[j])))
        {
            temp[stp] = a[i];
            i++;
        }
        else
        {
            temp[stp] = a[j];
            j++;
        }
    }
    for (int stp = 0; stp < r - l + 1; stp++)
        a[l + stp] = temp[stp];
}

Пробовал в функции сортировки создавать дополнительные массивы другим способом:
C++
1
int *temp = new int[r];
Тогда исключение другое:
Кликните здесь для просмотра всего текста
Массив большого размера не заполняется
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.12.2018, 06:51
Ответы с готовыми решениями:

Статический массив большого размера
Здраствуйте, скорее всего данная проблема у многих есть, этот код вызывает ошибку на этапе...

Как создать массив большого размера
В программе будет использоваться массив большого размера. Оперативная память - 512 МБ Создаю...

Файл или массив большого размера вывести на экран через буфер маленького размера
Приветствую! Суть: нужно продеть слона int slon длиной 13467 через игольное ушко byte uho = new...

Как создать массив большого размера?
Мне необходимо создать массив очень большой размерности - порядка 300 строк на 29^5*5...

3
Злостный нарушитель
9682 / 5243 / 1197
Регистрация: 12.03.2015
Сообщений: 24,711
11.12.2018, 09:23 2
Как интересно.
В любом случае, покажи значения индексов массивов. Приложение-то 32-битное, я вижу.

Массив большого размера не заполняется


Массив большого размера не заполняется


Массив большого размера не заполняется
1
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
11.12.2018, 17:12 3
Лучший ответ Сообщение было отмечено DioxiT как решение

Решение

Функция sortMerge рекурсивная, следовательно вызывается она в данном случае не 1, а https://www.cyberforum.ru/cgi-bin/latex.cgi?n \cdot log(n) раз. Выделение памяти в вашем коде вижу, а вот освобождение - нет. Когда память закончится, вместо указателя на участок памяти вы получите nullptr от функции malloc() или исключение std::bad_alloc от оператора new. Всё как у вас на скринах.

Вывод: после использования память нужно освобождать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void sortMerge(int *a, int l, int r)
{
    if (l == r) return; //границы сомкнулись
    int mid = (l + r) / 2; //определение середины массива
 
    //рекурсивный вызов сортировки каждой половины массива
    sortMerge(a, l, mid);
    sortMerge(a, mid + 1, r);
 
    int i = l; //начало первого пути
    int j = mid + 1; //начало второго пути
 
    int *temp = new int[r - l + 1]; //создание дополнительного массива
    for (int stp = 0; stp < r - l + 1; stp++)
    {
        if ((j > r) || ((i <= mid) && (a[i] < a[j])))
        {
            temp[stp] = a[i];
            i++;
        }
        else
        {
            temp[stp] = a[j];
            j++;
        }
    }
    for (int stp = 0; stp < r - l + 1; stp++)
        a[l + stp] = temp[stp];
 
    // Освобождение памяти !!!
    delete[] temp;
}
1
0 / 0 / 0
Регистрация: 11.12.2018
Сообщений: 32
11.12.2018, 21:29  [ТС] 4
Переключился на x64, действительно кинуло исключение std::bad_alloc
Затем добавил освобождение памяти, все работает. Благодарю за помощь!!!
0
11.12.2018, 21:29
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.12.2018, 21:29
Помогаю со студенческими работами здесь

Плавное изменение размера окна, когда ItemsSource у ItemsControl очищается и заполняется
Подскажите как это сделать? &lt;view9:ErrorMessageControl Grid.Column=&quot;0&quot; ...

Дан массив А размера N. Сформировать новый массив В того же размера по следующему правилу: элемент Вк равен сумме элемен
Дан массив А размера N. Сформировать новый массив В того же размера по следующему правилу: элемент...

Дана прямоугольная матрица А размера mхn и массив В логических переменных размера m. По матрице А получить массив В
Дана прямоугольная матрица А размера mхn и массив В логических переменных размера m. По матрице А...

ImageView большого размера
Всем привет, подскажите как правильно сделать , у меня есть картинка большого размера 4000х2000 и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

Новые блоги и статьи
Какой локальный веб-сервер выбрать
InfoMaster 19.01.2025
В современной веб-разработке локальные веб-серверы играют ключевую роль, предоставляя разработчикам надежную среду для создания, тестирования и отладки веб-приложений без необходимости использования. . .
Почему планшеты и iPad уже не так популярны, как раньше
InfoMaster 19.01.2025
Эра революционных инноваций История планшетных компьютеров началась задолго до того, как эти устройства стали привычными спутниками нашей повседневной жизни. В начале 1990-х годов появились первые. . .
Как самому прошить BIOS ноутбука
InfoMaster 19.01.2025
BIOS (Basic Input/ Output System) представляет собой важнейший компонент любого компьютера или ноутбука, который обеспечивает базовое взаимодействие между аппаратным и программным обеспечением. . .
Какой Linux выбрать для домашнего компьютера
InfoMaster 19.01.2025
Современные реалии выбора операционной системы В современном мире выбор операционной системы для домашнего компьютера становится все более важным решением, которое может существенно повлиять на. . .
Как объединить два словаря одним выражением в Python
InfoMaster 19.01.2025
В мире программирования на Python работа со словарями является неотъемлемой частью разработки. Словари представляют собой мощный инструмент для хранения и обработки данных в формате "ключ-значение". . . .
Как без исключения проверить существование файла в Python
InfoMaster 19.01.2025
При разработке программного обеспечения на Python часто возникает необходимость проверить существование файла перед выполнением операций с ним. Это критически важная задача, которая помогает избежать. . .
Как определить, содержит ли строка подстроку в JavaScript
InfoMaster 19.01.2025
При разработке веб-приложений часто возникает необходимость выполнять различные операции со строками, среди которых особое место занимает поиск подстрок. JavaScript предоставляет несколько встроенных. . .
Что такое метаклассы в Python
InfoMaster 19.01.2025
Метаклассы в Python представляют собой один из самых мощных и одновременно сложных механизмов языка, позволяющий программистам контролировать процесс создания классов. По своей сути, метакласс. . .
Как удалить свойство из объекта JavaScript
InfoMaster 19.01.2025
В современной веб-разработке объекты JavaScript играют фундаментальную роль в организации и структурировании данных. Они представляют собой контейнеры, которые хранят связанные данные и. . .
Какая разница между String и string в C#
InfoMaster 19.01.2025
В языке программирования C# существует интересная особенность: для работы со строками можно использовать как String, так и string. Эта двойственность часто вызывает вопросы у разработчиков, особенно. . .
Как в Git откатить репозиторий к предыдущему коммиту
InfoMaster 19.01.2025
В современной разработке программного обеспечения система контроля версий Git стала неотъемлемой частью рабочего процесса, предоставляя разработчикам мощные инструменты для управления изменениями в. . .
Как работают замыкания (closure) в JavaScript
InfoMaster 19.01.2025
В мире современной веб-разработки замыкания (closures) представляют собой один из фундаментальных концептов языка JavaScript, который часто вызывает затруднения у начинающих разработчиков, но при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru