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

new , delete (двумерный динамический массив)

03.12.2012, 14:59. Показов 13001. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В данном примере рассмотрена задача: в двумерном динамическом массиве , в каждой строке нужно найти максимальное и поменять его знак на противоположный. После чего вывести получившийся массив. Проблем всего 2:
Первая проблема состоит в том, что я не пойму как мне вывести получившийся массив.
А вторая проблема в том , что не могу корректно высвободить память через delete. После 2,3 запусков программа виснет.
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
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <time.h>
using namespace std;
 
int main()
{   
    setlocale(0,"");
    int s=0,m,n, **mas, min, max,d;
    cout<<"Введите количество строк и столбцов матрицы соответственно: "<<endl;
    cin>>m>>n;
    mas = new int * [m];
    for (int i=0; i<n; i++)
        mas[i] = new int [n];
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++)
        {   
            mas[i][j]= 10 + rand() % 100 ;
            cout<<"\nmassiv["<<i<<"]["<<j<<"] = "<<mas[i][j];     
        }
    }
    
    cout<<"\nВведенный массив:"<<endl;
    cout << "\n";
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++)
            cout<<mas[i][j]<<"  ";
        cout<<endl;
    }
    
       for (int i=0; i<m; i++) {
        min = max = mas[i][0];
        for (int j=0,s=0; j<n;s++,j++)
        {
            if (max < mas[i][j])
                max = mas[i][j];
            
        }
        
        cout<<" max в стоке "<<i+1<<" = "<<max<<" Обратное: "<< -max<<endl;
 
       }
    
    cout<<"\nПолученный массив массив:"<<endl;
 
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++) 
            cout<<mas[i][j]<<"  ";
            cout<<endl;
        
      
    }
    system("pause");
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.12.2012, 14:59
Ответы с готовыми решениями:

Динамический массив и delete
Всегда учили писать в конце программы delete(массив) в случаи если он динамический, но в последние время стал замечать наглецов которые так...

Динамический массив структур. Почему данные доступны после выполнения операции delete []
Всем привет! Выполнил вот такое задание. После того как вывелись данные трех структур, очищаю выделенную область памяти оператором delete...

Двумерный Динамический массив
Здравствуйте, такая проблема: не могу задать int** и char**...проблема в том что в функцию передются их размеры , но они не константы и...

19
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.12.2012, 15:33
C++
1
2
3
for (int i = 0; i < M; ++i)
    delete[] arr[i];
delete[] arr;
0
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 14
03.12.2012, 15:43  [ТС]
Цитата Сообщение от go Посмотреть сообщение
C++
1
2
3
for (int i = 0; i < M; ++i)
    delete[] arr[i];
delete[] arr;
блин все равно виснет и выдает ошибку(цитирую):

<ОС Windows инициировала точку останова в mas.exe.

Это может быть вызвано повреждением кучи и указывает на ошибку в mas.exe или в одной из загруженных им DLL.

Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит mas.exe

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки>
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.12.2012, 15:46
Цитата Сообщение от certykys Посмотреть сообщение
mas = new int * [!!!m!!!];
* * for (int i=0; i<!!!n!!!; i++)
Здесь ошибка, в обоих случаях должна быть одна и тажа переменная. Потом ее и в мой цикл подставте.
0
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 14
03.12.2012, 15:56  [ТС]
Цитата Сообщение от go Посмотреть сообщение
Здесь ошибка, в обоих случаях должна быть одна и тажа переменная. Потом ее и в мой цикл подставте.
В смысле одна переменная ? подставить m или n ? это имеет значение?
вот так правильно, просто дальше уже идет цикл c m переменной.
Цитата Сообщение от certykys Посмотреть сообщение
mas = new int * [m];
* * for (int i=0; i<m; i++) (в этой строке заменил n на m)
* * * * mas[i] = new int [n];
* * for (int i=0; i<m; i++)
...

Цитата Сообщение от certykys Посмотреть сообщение
for (int i = 0; i < m; ++i)
* * delete[] mas[i];
delete[] mas;
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
03.12.2012, 16:00
Цитата Сообщение от certykys Посмотреть сообщение
mas = new int * [m];
* * for (int i=0; i<n; i++)
* * * * mas[i] = new int [n];
Вы создаете массив указателей размером m, а в цикле, при создании уже массивов чисел, идёте от 0 до n.
0
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 14
03.12.2012, 16:25  [ТС]
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вы создаете массив указателей размером m, а в цикле, при создании уже массивов чисел, идёте от 0 до n.
Правильно ли я понял , что нужно написать от 0 до m? Я создал массив указателей m, соответственно и массив чисел должен идти от 0 до m ? Ни как не догоняю...

Добавлено через 14 минут
Объясни как должно быть , пожалуйста , как мне все таки правильно написать.
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
03.12.2012, 16:31
certykys, m это количество указателей на одномерные массивы. То есть, грубо говоря, это количество строк. Вы создаете массив указателей размером m, затем каждому указателю из этого массива, присваиваете уже адрес одномерного массива.
В общем по простому:
**mas - это тип 'указатель на указатель'
Здесь
C++
1
mas = new int * [m];
Вы выделяете память под m элементов типа 'int *', то есть под m элементов типа 'указатель на int'. В итоге у Вас имеется m указателей.
Теперь каждому из этих указателей, нужно присвоить некоторый адрес:
C++
1
2
for (int i=0; i<m; i++)       //проходим по всем указателям, от 0 до m.
        mas[i] = new int [n]; // и присваиваем им адрес выделенной памяти под n элементов типа int.
1
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 14
03.12.2012, 16:36  [ТС]
Все ясно. Просто я представлял себе это немного иначе. Спасибо.
Но ошибка все равно выходит:
<Необработанное исключение в "0x77c015de" в "mas.exe": 0xC0000005: Нарушение прав доступа при записи "0xfdfdfdfd".>
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
03.12.2012, 16:40
Ваш код рабочий, если исправить описанную Выше ситуацию.
0
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 14
03.12.2012, 16:54  [ТС]
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
#include <iostream>
#include <conio.h>
#include <cstdlib>
#include <time.h>
using namespace std;
 
int main()
{   
    setlocale(0,"");
    int s=0,m,n, **mas, min, max;
    cout<<"Введите количество строк и столбцов матрицы соответственно: "<<endl;
    cin>>m>>n;
    mas = new int * [m];
    for (int i=0; i<m; i++)
        mas[i] = new int [n];
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<n; j++)
        {   
            mas[i][j]= 10 + rand() % 100 ;
            cout<<"\nmassiv["<<i<<"]["<<j<<"] = "<<mas[i][j];     
        }
    }
    
       for (int i=0; i<m; i++) {
        min = max = mas[i][0];
        for (int j=0,s=0; j<n;s++,j++)
        {
            if (max < mas[i][j])
                max = mas[i][j];
        }
        cout<<" max в стоке "<<i+1<<" = "<<max<<" Обратное: "<< -max<<endl;
       }
    cout<<"\nПолученный массив массив:"<<endl;
 
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++) 
            cout<<mas[i][j]<<"  ";
            cout<<endl;
    }
    for (int i = 0; i < m ; ++i) {
    
        delete[] mas[i];
        delete[] mas;
    }
    system("pause");
}
Добавлено через 5 минут
может я чего напутал или это еще от системы зависит , потому что он мне все равно эту ошибку выдает((((((((((((((((((((
0
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
03.12.2012, 16:58
Строки 16-17
C++
1
2
3
for (int i=0; i<n; i++)
{
    for (int j=0; j<n; j++)
Почему в обоих циклах n?

Добавлено через 1 минуту
Очистку памяти тоже неверно делаешь. Зачем delete[] mas - в цикле?
0
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 14
03.12.2012, 17:07  [ТС]
Цитата Сообщение от Schizorb Посмотреть сообщение
Почему в обоих циклах n?
так а что там должно стоять?
Понял! Там должно вместо быть в первом цикле m , а во втором n !
или нет?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
03.12.2012, 17:08
Так массив то у тебя не квадратный(n на n), а прямоугольный m на n!!!
0
 Аватар для Schizorb
512 / 464 / 81
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
03.12.2012, 17:11
Ну если у тебя m строк и n столбцов, то ты как думаешь?
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
03.12.2012, 17:13
Цитата Сообщение от certykys Посмотреть сообщение
Понял! Там должно вместо быть в первом цикле m , а во втором n !
или нет?
Именно так.
По поводу удаления - сначала освобождаем всю память, на которую указывают m указателей.
C++
1
2
for ( int i = 0; i < m; i++ )
   delete [] mass[ i ];
А потом, после цикла, освобождаем память, которая была выделена под сами указатели.
C++
1
delete [] mass;
1
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 14
03.12.2012, 17:17  [ТС]
C++
1
2
3
4
5
6
mas = new int *[m];
    for (int i=0; i<m; i++)
        mas[i] = new int [n];
      for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++)
вот так будет. Код работает. Наконец-то))))))))

Добавлено через 1 минуту
Цитата Сообщение от Toshkarik Посмотреть сообщение
Именно так.
По поводу удаления - сначала освобождаем всю память, на которую указывают m указателей.
C++
1
2
for ( int i = 0; i < m; i++ )
   delete [] mass[ i ];
А потом, после цикла, освобождаем память, которая была выделена под сами указатели.
C++
1
delete [] mass;
спасибо))))))))))
0
 Аватар для activnaya
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
03.12.2012, 18:30
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
#include <iostream>
#include <vector>
#include <iomanip>
#include <cstdint>
#include <iomanip>
#include <cstdlib>
#include <ctime>
 
typedef uint32_t uint_t;
 
#define RAND_MAXIMUM (50)
 
class shit
{
private:
    std::vector<int*> matrix;
    std::vector<int> column;
public:
 
    shit(uint_t __row, uint_t __colm)
    {
        matrix.resize(__row);
        column.resize(__colm * __row);
 
        for (uint_t i = 0; i < matrix.size(); ++i)
            matrix[ i ] = &column[__colm * i];
 
        for (auto it = column.begin(); it != column.end(); ++it)
            *it = std::rand() % RAND_MAXIMUM; //Сишный рандом куда проще, чем плюсовой
    }
 
    ~shit(){}
 
    std::ostream &operator <<(std::ostream &out)
    {
        for (uint_t i = 0; i < matrix.size(); ++i)
        {
            for (uint_t j = 0; j < column.size() / matrix.size(); ++j)
                out << std::setw(3) << matrix[ i ][ j ];
            out << '\n';
        }
        out << '\n';
        return out;
    }
 
    void set_val()
    {
        for (uint_t i = 0; i < matrix.size(); ++i)
        {
            int max = matrix[ i ][ 0 ];
            uint_t index = 0;
 
            for (uint_t j = 0; j < column.size() / matrix.size(); ++j)
                if (matrix[ i ][ j ] > max)
                {
                    index = j;
                    max = matrix[ i ][ j ];
                }
            matrix[ i ][ index ] *= -1;
        }
    }
};
 
int main()
{
    std::srand(std::time(NULL)); //сишный рандом проще и понятней
    shit O(4,5);
 
    std::cout << "default matrx are: \n";
    O.operator <<(std::cout);
    O.set_val();
    std::cout << "changed matrix are: \n";
    O.operator <<(std::cout);
 
    return 0;
}
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
03.12.2012, 20:12
Я бы так сделал
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
#include <iostream>
#include <algorithm>
#include <vector>
#include <random>
#include <ctime>
#include <iterator>
 
std::ostream& operator<<(std::ostream &os, const std::vector< std::vector<int> > &m)
{
    std::for_each(std::begin(m), std::end(m), [&] (const std::vector<int> &v)
    {
        std::copy(std::begin(v), std::end(v), std::ostream_iterator<int> (os, "  "));
        os << std::endl;
    });
    return os;
}
 
 
int main()
{
   std::mt19937 gen(static_cast<unsigned long> (std::time(NULL)));
   std::uniform_int_distribution<> distr(10, 99);
   
   std::vector< std::vector<int> > mt(10);
   
   std::for_each(std::begin(mt), std::end(mt), [&] (std::vector<int> &v)
   {
        std::mt19937 &genn(gen);
        std::uniform_int_distribution<> &distrr(distr);
        std::vector<int> t(10);
        std::generate_n(std::begin(t), 10, [&] { return distrr(genn); });
        v = t;
   });
   
   std::cout << mt << std::endl;
   
   std::for_each(std::begin(mt), std::end(mt), [] (std::vector<int> &v)
   {
       *std::max_element(std::begin(v), std::end(v)) *= -1;
   });
 
   std::cout << mt << std::endl;
 
   std::system("pause");
   return 0;
}
Добавлено через 13 минут
Там где он реализован можно использовать
C++
1
std::random_device rd;
1
 Аватар для activnaya
256 / 46 / 4
Регистрация: 24.11.2012
Сообщений: 466
03.12.2012, 20:17
go, крутяк
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.12.2012, 20:17
Помогаю со студенческими работами здесь

Двумерный динамический массив
Необходимо ввести с клавиатуры количество строк и столбцов массива(матрица размером N*M), ввести исходные данные. Удалить столбец матрицы,...

Двумерный динамический массив
Выскакивает ошибка Ошибка C2440 =: невозможно преобразовать &quot;int *&quot; в &quot;int **&quot; ConsoleApplication5 Из-за этого не выполняются...

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

Двумерный динамический массив
Здравствуйте, подскажите пожалуйста где ошибка? реализовал 2 фукнции ввода и вывода массива. #include &lt;iostream&gt; #include...

Динамический двумерный массив
Если число находится в интервале от 100 до 110, то используя подпрограмму, в матрицах Р(N,M), Q(N1,M1) и R(N2,M2) найти и отпечатать L -...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru