С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 11.12.2018
Сообщений: 32
1

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

11.12.2018, 06:51. Показов 1473. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2018, 06:51
Ответы с готовыми решениями:

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

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

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

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

3
Злостный нарушитель
9612 / 5204 / 1186
Регистрация: 12.03.2015
Сообщений: 24,562
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
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
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru