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

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

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

Author24 — интернет-сервис помощи студентам
Вечер в хату, форумчане, помогите пжлст, не могу понять как исправить ошибку.
Задание:Разработайте библиотеку функций для работы с прямоугольными матрицами целочисленных значений размерности 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2017, 17:37
Ответы с готовыми решениями:

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

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

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

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

12
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
15.12.2017, 17:46 2
Цитата Сообщение от 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  [ТС] 3
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
Мир тебе, залетный! Ты бы хотя бы поведал, как ошибка проявляет себя.
Matrix.exe вызвал срабатывание точки останова. Вызвано исключение вот здесь
Цитата Сообщение от Surv Посмотреть сообщение
delete[] p[i];
При квадратной матрице всё работает на ура, а при неквадртаной эта ошибка

Добавлено через 42 секунды
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
Ты и так используешь оператор для удаления массива
Я удаляю вначале элементы, а потом сам массив, разве нет? + он ещё двумерный
0
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
15.12.2017, 17:48 4
Цитата Сообщение от 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  [ТС] 5
Цитата Сообщение от 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 6
Цитата Сообщение от Surv Посмотреть сообщение
Я удаляю вначале элементы, а потом сам массив, разве нет? + он ещё двумерный
Ты выделяешь массив указателей. И все....

Чтобы удалять так, как ты ег оудаляешь, ты еще должен для каждого элемента этого массива выделить еще память.
0
2 / 2 / 1
Регистрация: 08.10.2017
Сообщений: 64
15.12.2017, 17:55  [ТС] 7
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
Чтобы удалять так, как ты ег оудаляешь, ты еще должен для каждого элемента этого массива выделить еще память.
Как мне тогда удалить? оставить только?!?
C++
1
delete[] p;
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
15.12.2017, 17:57 8
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  [ТС] 9
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
выделили массив MxN
всё так же как и в коде, но не работает с не квадратной матрицей.

Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
Хотя я бы сделал сразу
функции жалуются, что нужен указатель на указатель
0
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
15.12.2017, 18:07 10
Surv, короче, я поковырялся. Вывод: вы напутали m и n в объявлениях\вызовах функций.
0
2 / 2 / 1
Регистрация: 08.10.2017
Сообщений: 64
15.12.2017, 18:08  [ТС] 11
Цитата Сообщение от Herji Посмотреть сообщение
Surv, короче, я поковырялся. Вывод: вы напутали m и n в объявлениях\вызовах функций.
я это предполагал)
Можете конкретно указать где? Не хочется всё переделывать..
0
299 / 208 / 174
Регистрация: 11.05.2016
Сообщений: 655
15.12.2017, 18:13 12
Цитата Сообщение от 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  [ТС] 13
Цитата Сообщение от Herji Посмотреть сообщение
либо аргументы правьте, либо обращение к функциям
а что здесь не так? всё же верно.. или нет??
0
15.12.2017, 18:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.12.2017, 18:18
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru