Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 17.12.2020
Сообщений: 11

Выхожу за границы массива, не вижу где

24.12.2020, 18:28. Показов 1036. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сабж) помогите кто более глазастый чем я, дело в функции Sort_5
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <bits/stdc++.h>
 
using namespace std;
 
void Sort_3 (int * A, int m) // сортировка выбором
{
    for (int rep = 0; rep <m; rep ++)
    {
        int temp = A [0]; // временная переменная для хранения значения перестановки
        for (int elem = rep + 1; elem <m; elem ++)
        {
            if (A [rep]> A [elem])
            {
                temp = A [rep];
                A [rep] = A [elem];
                A [elem] = temp;
            }
        }
    }
}
 
void Sort_5 (int *a, int l, int r)
{
  if (l == r) return; // границы сомкнулись
  int mid = (l + r) / 2; // определяем середину последовательности
  // и рекурсивно вызываем функцию сортировки для каждой половины
  Sort_5(a, l, mid);
  Sort_5(a, mid + 1, r);
  int i = l;  // начало первого пути
  int j = mid + 1; // начало второго пути
  int *tmp = (int*)malloc(r * sizeof(int)); // дополнительный массив
  for (int step = 0; step < r - l + 1; step++) // для всех элементов дополнительного массива
  {
    // записываем в формируемую последовательность меньший из элементов двух путей
    // или остаток первого пути если j > r
    if ((j > r) || ((i <= mid) && (a[i] < a[j])))
    {
      tmp[step] = a[i];
      i++;
    }
    else
    {
      tmp[step] = a[j];
      j++;
    }
  }
  // переписываем сформированную последовательность в исходный массив
  for (int step = 0; step < r - l+1; step++)
    a[l + step] = tmp[step];
}
 
int main ()
{
    srand (time (NULL));
    setlocale (LC_ALL, "rus");
    cout << "Введите размер массива: ";
    int n; // Размер массива
    cin >> n;
 
    int * Ready = new int [n]; // одномерный динамический массив
 
    cout << "Начальный массив: ";
    for (int i = 0; i < n; i ++)
    {
        Ready [i] = rand ()% 100; // заполняем массив случайными числами
        cout << Ready [i] << " "; // вывод массива на экран
    }
    cout << endl;
 
    int menu = 0;
    do
    {
        cout << "1. Сортировка выбором " << endl;
        cout << "2. Сортировка слиянием " << endl;
        cout << "0. Выход " << endl;
        cin >> menu;
        switch (menu)
        {
        case 1:
            cout << "Массив после сортировки выбором: ";
            Sort_3 (Ready, n); // вызов функции сортировки выбором
            for (int i = 0; i<n; i ++)
            {
                cout << Ready [i] << " "; // печать отсортированного массива
            }
                cout << endl;
                break;
 
            case 2:
                cout << "Массив после сортировки слиянием: ";
                Sort_5 (Ready,0, n); // вызов функции сортировки слиянием
                for (int i = 0; i<n; i ++)
                {
                    cout << Ready [i] << " "; // печать отсортированного массива
                }
                    cout << endl;
                    break;
                }
 
            }
        while (menu != 0);
 
        if (menu=0)
        delete [] Ready; // высвобождаем память
        return 0;
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.12.2020, 18:28
Ответы с готовыми решениями:

С++ Ругается на размерность, выхожу за границы массива. Необходима написать правильный, работающий код
Ругается на размерность, выхожу за границы массива. Необходима написать правильный, работающий код. Задані дійсні числа b1,…,b6,...

Не могу понять, где выхожу за пределы динамического массива.Голову сломал
ВОТ КОД : #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;random&gt; #include &lt;ctime&gt; using namespace std; void...

Не вижу где ошибка
{ Online Pascal Compiler. Code, Compile, Run and Debug Pascal program online. Write...

21
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
24.12.2020, 19:25
попробуйте в строке 91 заменить n на n-1
1
0 / 0 / 0
Регистрация: 17.12.2020
Сообщений: 11
24.12.2020, 19:40  [ТС]
Стало лучше, но при большом размере массиве вылетает с кодом -1073740940 (0xC0000374).
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
24.12.2020, 19:58
Цитата Сообщение от AncoresRus Посмотреть сообщение
при большом размере массиве
напишите конкретнее, каком именно размере
0
0 / 0 / 0
Регистрация: 17.12.2020
Сообщений: 11
24.12.2020, 20:00  [ТС]
Интересуют N=100, N=1000, N=5 000, N=10 000. Если в 91 стоке n на n-1 поменять, то у меня пропадает последний элемент массива
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.12.2020, 20:01
Цитата Сообщение от AncoresRus Посмотреть сообщение
Стало лучше, но при большом размере массиве вылетает с кодом -1073740940 (0xC0000374).
Ты рекурсивно выделяешь память. Удивительно, что при маленьком размере отрабатывает.
Цитата Сообщение от AncoresRus Посмотреть сообщение
int *tmp = (int*)malloc(r * sizeof(int)); // дополнительный массив
Добавлено через 54 секунды
Проблема в том, что ты её не удаляешь
0
0 / 0 / 0
Регистрация: 17.12.2020
Сообщений: 11
24.12.2020, 20:09  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ты рекурсивно выделяешь память.
Почему рекурсивно я, к сожалению, не понял. Я же это делаю один раз
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
24.12.2020, 20:11
Цитата Сообщение от AncoresRus Посмотреть сообщение
у меня пропадает последний элемент массива
у меня не пропадает:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
 
void Sort_5 (int *a, int l, int r)
{
  if (l == r) return; // границы сомкнулись
  int mid = (l + r) / 2; // определяем середину последовательности
  // и рекурсивно вызываем функцию сортировки для каждой половины
  Sort_5(a, l, mid);
  Sort_5(a, mid + 1, r);
  int i = l;  // начало первого пути
  int j = mid + 1; // начало второго пути
  int *tmp = (int*)malloc(r * sizeof(int)); // дополнительный массив
  for (int step = 0; step < r - l + 1; step++) // для всех элементов дополнительного массива
  {
    // записываем в формируемую последовательность меньший из элементов двух путей
    // или остаток первого пути если j > r
    if ((j > r) || ((i <= mid) && (a[i] < a[j])))
    {
      tmp[step] = a[i];
      i++;
    }
    else
    {
      tmp[step] = a[j];
      j++;
    }
  }
  // переписываем сформированную последовательность в исходный массив
  for (int step = 0; step < r - l+1; step++)
    a[l + step] = tmp[step];
}
 
int main()
{
    srand((int)time(0));
    int n;
    cout << "n="; cin >> n;
 
    int *a = new int[n];
 
    for (int i = 0; i < n; i++)
    {
        a[i]=rand()%9 + 1;
        cout << a[i] << " ";
    }
    cout << "\n";
    
    Sort_5 (a,0, n-1); // вызов функции сортировки слиянием
    
    for (int i = 0; i < n; i++)    
        cout << a[i] << " ";   
    cout << "\n";
    
    delete[]a;
system("pause");
return 0;
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.12.2020, 20:15
Цитата Сообщение от AncoresRus Посмотреть сообщение
Почему рекурсивно я, к сожалению, не понял. Я же это делаю один раз
Ты рекурсивно вызываешь Sort_5 и каждый раз делаешь malloc

Добавлено через 24 секунды
И ни разу free()
0
0 / 0 / 0
Регистрация: 17.12.2020
Сообщений: 11
24.12.2020, 20:31  [ТС]
Речь про цикл с 99 по 129 стоки?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.12.2020, 20:34
Цитата Сообщение от AncoresRus Посмотреть сообщение
Речь про цикл с 99 по 129 стоки?
Ага, почти. Совсем чуть-чуть промазал.
Речь вот про это.
Цитата Сообщение от AncoresRus Посмотреть сообщение
void Sort_5 (int *a, int l, int r)
{
  if (l == r) return; // границы сомкнулись
  int mid = (l + r) / 2; // определяем середину последовательности
  // и рекурсивно вызываем функцию сортировки для каждой половины
  Sort_5(a, l, mid);
  Sort_5(a, mid + 1, r);
  int i = l;  // начало первого пути
  int j = mid + 1; // начало второго пути
  int *tmp = (int*)malloc(r * sizeof(int)); // дополнительный массив
0
0 / 0 / 0
Регистрация: 17.12.2020
Сообщений: 11
24.12.2020, 20:37  [ТС]
Мне для отдельных кусков не надо дополнительную память выделять разве? Как из этой ситуации лучше выйти?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.12.2020, 20:42
Цитата Сообщение от AncoresRus Посмотреть сообщение
Мне для отдельных кусков не надо дополнительную память выделять разве? Как из этой ситуации лучше выйти?
Удалять её надо при выходе

Добавлено через 41 секунду
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Проблема в том, что ты её не удаляешь
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
И ни разу free()
Ещё раз повторить?
0
0 / 0 / 0
Регистрация: 17.12.2020
Сообщений: 11
24.12.2020, 20:52  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Удалять её надо при выходе
Так у меня в c хранится готовый массив, а удаляю я в самом конце. Что нужно удалить и где можно поконкретнее пожалуйста?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.12.2020, 21:21
Цитата Сообщение от AncoresRus Посмотреть сообщение
Так у меня в c хранится готовый массив, а удаляю я в самом конце. Что нужно удалить и где можно поконкретнее пожалуйста?
Для каждого вызова malloc надо делать вызов free. Ты это делаешь?
0
0 / 0 / 0
Регистрация: 17.12.2020
Сообщений: 11
24.12.2020, 21:41  [ТС]
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
void Sort_5 (int *a, int l, int r)
{
  if (l == r) return; // границы сомкнулись
  int mid = (l + r) / 2; // определяем середину последовательности
  // и рекурсивно вызываем функцию сортировки для каждой половины
  Sort_5(a, l, mid);
  Sort_5(a, mid + 1, r);
  int i = l;  // начало первого пути
  int j = mid + 1; // начало второго пути
  int *tmp = (int*)malloc(r * sizeof(int)); // дополнительный массив
  for (int step = 0; step < r - l + 1; step++) // для всех элементов дополнительного массива
  {
    // записываем в формируемую последовательность меньший из элементов двух путей
    // или остаток первого пути если j > r
    if ((j > r) || ((i <= mid) && (a[i] < a[j])))
    {
      tmp[step] = a[i];
      i++;
    }
    else
    {
      tmp[step] = a[j];
      j++;
    }
  }
 
  // переписываем сформированную последовательность в исходный массив
  for (int step = 0; step < r - l+1; step++)
    a[l + step] = tmp[step];
     free (tmp);
}
Так? все равно не работает, видимо я чего-то не понимаю)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.12.2020, 21:42
Цитата Сообщение от AncoresRus Посмотреть сообщение
Так?
Работает?
0
0 / 0 / 0
Регистрация: 17.12.2020
Сообщений: 11
24.12.2020, 21:52  [ТС]
Нет)
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.12.2020, 21:54
Цитата Сообщение от AncoresRus Посмотреть сообщение
Так? все равно не работает, видимо я чего-то не понимаю)
Цитата Сообщение от AncoresRus Посмотреть сообщение
nt *tmp = (int*)malloc(r * sizeof(int)); // дополнительный массив
Здесь, наверное, надо выделять массив размером (r - l + 1), а не r
0
0 / 0 / 0
Регистрация: 17.12.2020
Сообщений: 11
24.12.2020, 22:32  [ТС]
Не помогло, но я подглядел решение тут Сортировка слиянием
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.12.2020, 22:32
Помогаю со студенческими работами здесь

Сколько смотрю, не вижу где ошибка
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace System; int main() { setlocale(LC_ALL,&quot;RUS&quot;); float fcena,...

После работы с Акронисом не вижу где мои Гб
Здравствуйте уважаемые!)))Случилась беда, для определённых операций на системном диске С мне потребовалось больше памяти, прогуглив как всё...

Angular 2 component не вижу где этот пункт меню?
добрый день Начала изучать angular 2 Не могу найти пункт меню angular 2 component в среде Intellij IDEA Подскажите где он пожалуйста?

Установил компонент, вижу интерфейс, не вижу самого компонента
Rad Studio XE5. Зарегистрировал dll Собрал tlb Импортировал компонент из длл Размещаю импортированный компонент на форму Вижу...

на windows 7 не вижу интернета но вижу сеть
Здраствуйте начну пожалуй по порядку. На протяжении долгох лет пользовался ХР, захотелось чего то нового и решил себе поставить win 7. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru