Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
2 / 2 / 1
Регистрация: 08.10.2017
Сообщений: 64

Ошибка с удалением памяти от динамического двумерного массива

15.12.2017, 17:37. Показов 4002. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вечер в хату, форумчане, помогите пжлст, не могу понять как исправить ошибку.
Задание:Разработайте библиотеку функций для работы с прямоугольными матрицами целочисленных значений размерности nxm (n,m<=10). Реализацию функций разместите в файлах исходного кода Matrix.cpp, интерфейс функций - в Matrix.h. В состав библиотеки включите следующие функции:
1. ввод элементов прямоугольной целочисленной матрицы размерности NxM с клавиатуры:
void InputTwoArray(int a[n][m], int N, int M);

2. вывод элементов прямоугольной целочисленной матрицы размерности NxM на консоль:
void PrintMatrix(int a[n][m], int N, int M);

3. сортировка элементов k-ой строки матрицы по возрастанию (любым известным вам алгоритмом)

void SortLine(int a[n][m], int N, int M, int k);

4.нахождение позиции максимального элемента матрицы и его значения (функция возвращает значение максимального элемента матрицы, а его позицию сохраняет в переменных maxi и maxj)

int MaxMatrix(int a[n][m], int N, int M, int& maxi, int& maxj);

Matrix.cpp
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
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include "matrix.h"
using namespace std;
void InputTwoArray(int** arr, int n, int m);
void PrintMatrix(int** arr, int n, int m);
void SortLine(int** arr, int m, int n, int k);
int MaxMatrix(int** arr, int m, int n);
int main() {
    int n, m, k;
    cout << " Enter N,M,K: " << endl;
    cin >> n >> m >> k;
    int** p = new int*[m];
    InputTwoArray(p,m,n);
    PrintMatrix(p, m, n);
    SortLine(p, m, n,k);
    PrintMatrix(p, m, n);
    MaxMatrix(p, m, n);
    for (int i = 0; i < m; i++) //удаление памяти(вроде здесь ошибка, но почему? возможно, напутал в функции столбцы и строки, но сам не разобрался)
    {
        delete[] p[i];
    }
    delete[] p;
    system("pause");
    return 0;
}
Matrix.h
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
#pragma once
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
using namespace std;
void InputTwoArray(int** arr, int n, int m)
{
    cout << "Task #1" << endl;
 
    //выделение памяти
    
 
    for (int i = 0; i < m; i++) {
        arr[i] = new int[n];
    }
    //ввод матрицы
 
    for (int i = 0; i < m; i++) {
    
        for (int j = 0; j < n; j++) {
            cout << "Enter a[" << i << "][" << j << "] ";
            cin >> arr[i][j];
        }
    }
    cout <<endl;
}
void PrintMatrix(int** arr, int n, int m) {//вывод матрицы
    cout << "Task #3" << endl;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cout << arr[i][j] << ' ';
        }
        cout << endl;
    }
}
void SortLine(int** arr, int m, int n, int k) {//сортировка
    cout << "Task #7" << endl;
    cout << "Processing.." << endl;
    cout << endl;
    k = k - 1;
    for (int i = 0; i < m; i++)
    {
        for (int j = m - 1; j > i; j--)
            if (arr[k][j] < arr[k][j - 1])
            {
                int tmp = arr[k][j];
                arr[k][j] = arr[k][j - 1];
                arr[k][j - 1] = tmp;
            }
    }
}
int MaxMatrix(int** arr, int m, int n) {//макс элемент
    int max = 0, maxi, maxj;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (arr[i][j] > max) {
                max = arr[i][j];
                maxi = i;
                maxj = j;
            }
        }
}
    cout << "Max element = " << arr[maxi][maxj] << "\n Column = " << maxj+1 << "\n String = " << maxi+1 << endl;//вывод макс элемента
    return arr[maxi][maxj];
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.12.2017, 17:37
Ответы с готовыми решениями:

Ошибка при удалением двумерного динамического массива
Задача состоит в том, чтобы загрузить массив из файла 17 0 0.40 10 0.3 20 0.12 30 0.45 40 0.122 50 0.44 60 0.66 70 0.85

Удаление двумерного динамического массива из памяти
Допустим дан двумерный динамический массив (созданный с помощью new). Как правильно удалить его из памяти? У меня есть три варианта: ...

Вылетает функция очистки памяти двумерного динамического массива
Я написал функции добавления и удаления столбцов и строчек двумерного динамического массива, создал меню, но когда сделаю несколько...

12
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
15.12.2017, 17:46
Цитата Сообщение от Surv Посмотреть сообщение
Вечер в хату, форумчане
Мир тебе, залетный! Ты бы хотя бы поведал, как ошибка проявляет себя.

Добавлено через 1 минуту
C++
1
2
3
4
for (int i = 0; i < m; i++) //удаление памяти(вроде здесь ошибка, но почему? возможно, напутал в функции столбцы и строки, но сам не разобрался)
    {
        delete[] p[i];
    }
просто
C++
1
delete[] p;
Добавлено через 50 секунд
Ты и так используешь оператор для удаления массива
0
2 / 2 / 1
Регистрация: 08.10.2017
Сообщений: 64
15.12.2017, 17:47  [ТС]
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
Мир тебе, залетный! Ты бы хотя бы поведал, как ошибка проявляет себя.
Matrix.exe вызвал срабатывание точки останова. Вызвано исключение вот здесь
Цитата Сообщение от Surv Посмотреть сообщение
delete[] p[i];
При квадратной матрице всё работает на ура, а при неквадртаной эта ошибка

Добавлено через 42 секунды
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
Ты и так используешь оператор для удаления массива
Я удаляю вначале элементы, а потом сам массив, разве нет? + он ещё двумерный
0
 Аватар для Herji
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
15.12.2017, 17:48
Цитата Сообщение от Surv Посмотреть сообщение
C++
1
2
3
4
5
6
7
void InputTwoArray(int** arr, int n, int m)
{
    cout << "Task #1" << endl;
//выделение памяти
for (int i = 0; i < m; i++) {
        arr[i] = new int[n];
    }
зачем тут "выделение памяти"?
выделяйте сразу в main
0
2 / 2 / 1
Регистрация: 08.10.2017
Сообщений: 64
15.12.2017, 17:52  [ТС]
Цитата Сообщение от Herji Посмотреть сообщение
зачем тут "выделение памяти"?
выделяйте сразу в main
удалил из функции и добавил в main и получилось вот так
C++
1
2
3
4
int** p = new int*[m];
    for (int i = 0; i < m; i++) {
        p[i] = new int[n];
    }
Но ошибка осталась та же
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
15.12.2017, 17:53
Цитата Сообщение от Surv Посмотреть сообщение
Я удаляю вначале элементы, а потом сам массив, разве нет? + он ещё двумерный
Ты выделяешь массив указателей. И все....

Чтобы удалять так, как ты ег оудаляешь, ты еще должен для каждого элемента этого массива выделить еще память.
0
2 / 2 / 1
Регистрация: 08.10.2017
Сообщений: 64
15.12.2017, 17:55  [ТС]
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
Чтобы удалять так, как ты ег оудаляешь, ты еще должен для каждого элемента этого массива выделить еще память.
Как мне тогда удалить? оставить только?!?
C++
1
delete[] p;
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
15.12.2017, 17:57
C++
1
2
3
4
5
int** p = new int*[m];
for (int i = 0; i < m; i++) 
    {
       p[i] = new int[n];
    }
выделили массив MxN
C++
1
2
3
4
5
for (int i = 0; i < m; i++) 
    {
        delete[] p[i];
    }
delete[] p;
Удалили

Добавлено через 1 минуту
Хотя я бы сделал сразу
C++
1
2
3
4
int *p = new int[m*n];
 
 
delete[] p;
0
2 / 2 / 1
Регистрация: 08.10.2017
Сообщений: 64
15.12.2017, 18:01  [ТС]
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
выделили массив MxN
всё так же как и в коде, но не работает с не квадратной матрицей.

Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
Хотя я бы сделал сразу
функции жалуются, что нужен указатель на указатель
0
 Аватар для Herji
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
15.12.2017, 18:07
Surv, короче, я поковырялся. Вывод: вы напутали m и n в объявлениях\вызовах функций.
0
2 / 2 / 1
Регистрация: 08.10.2017
Сообщений: 64
15.12.2017, 18:08  [ТС]
Цитата Сообщение от Herji Посмотреть сообщение
Surv, короче, я поковырялся. Вывод: вы напутали m и n в объявлениях\вызовах функций.
я это предполагал)
Можете конкретно указать где? Не хочется всё переделывать..
0
 Аватар для Herji
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
15.12.2017, 18:13
Цитата Сообщение от Surv Посмотреть сообщение
void InputTwoArray(int** arr, int n, int m);
void PrintMatrix(int** arr, int n, int m);
либо аргументы правьте, либо обращение к функциям
0
2 / 2 / 1
Регистрация: 08.10.2017
Сообщений: 64
15.12.2017, 18:18  [ТС]
Цитата Сообщение от Herji Посмотреть сообщение
либо аргументы правьте, либо обращение к функциям
а что здесь не так? всё же верно.. или нет??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.12.2017, 18:18
Помогаю со студенческими работами здесь

Выделение памяти для динамического двумерного массива внутри функции
Имеется вот такой код : #include &lt;iostream&gt; void allocateMemory(int ***array, int size); void freeMemory(int **array, int size); ...

Пример динамического двумерного массива по стандарту C++, располагающегося в монолитном участке памяти
Помогите пожалуйста привести пример динамического двумерного массива n на m в понимании стандарта Си++, так чтобы он весь располагался в...

Ошибка заполнения динамического двумерного массива
При заполнении массива mas происходит выход за границы массива. По ходу исполнения программы данные записываются в ячейки и т.д. Судя по...

Ошибка описания динамического двумерного массива
#include &lt;iostream&gt; using namespace std; int main() { int x, y, i, j; cout &lt;&lt; &quot;Введите кол-во строк и столбцов:...

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru