Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.61
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 14:59     new , delete (двумерный динамический массив) #1
В данном примере рассмотрена задача: в двумерном динамическом массиве , в каждой строке нужно найти максимальное и поменять его знак на противоположный. После чего вывести получившийся массив. Проблем всего 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");
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.12.2012, 15:33     new , delete (двумерный динамический массив) #2
C++
1
2
3
for (int i = 0; i < M; ++i)
    delete[] arr[i];
delete[] arr;
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 15:43  [ТС]     new , delete (двумерный динамический массив) #3
Цитата Сообщение от 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

Выведенное на экран окно содержит дополнительные данные для диагностики ошибки>
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.12.2012, 15:46     new , delete (двумерный динамический массив) #4
Цитата Сообщение от certykys Посмотреть сообщение
mas = new int * [!!!m!!!];
* * for (int i=0; i<!!!n!!!; i++)
Здесь ошибка, в обоих случаях должна быть одна и тажа переменная. Потом ее и в мой цикл подставте.
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 15:56  [ТС]     new , delete (двумерный динамический массив) #5
Цитата Сообщение от 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;
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.12.2012, 16:00     new , delete (двумерный динамический массив) #6
Цитата Сообщение от certykys Посмотреть сообщение
mas = new int * [m];
* * for (int i=0; i<n; i++)
* * * * mas[i] = new int [n];
Вы создаете массив указателей размером m, а в цикле, при создании уже массивов чисел, идёте от 0 до n.
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 16:25  [ТС]     new , delete (двумерный динамический массив) #7
Цитата Сообщение от Toshkarik Посмотреть сообщение
Вы создаете массив указателей размером m, а в цикле, при создании уже массивов чисел, идёте от 0 до n.
Правильно ли я понял , что нужно написать от 0 до m? Я создал массив указателей m, соответственно и массив чисел должен идти от 0 до m ? Ни как не догоняю...

Добавлено через 14 минут
Объясни как должно быть , пожалуйста , как мне все таки правильно написать.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.12.2012, 16:31     new , delete (двумерный динамический массив) #8
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.
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 16:36  [ТС]     new , delete (двумерный динамический массив) #9
Все ясно. Просто я представлял себе это немного иначе. Спасибо.
Но ошибка все равно выходит:
<Необработанное исключение в "0x77c015de" в "mas.exe": 0xC0000005: Нарушение прав доступа при записи "0xfdfdfdfd".>
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.12.2012, 16:40     new , delete (двумерный динамический массив) #10
Ваш код рабочий, если исправить описанную Выше ситуацию.
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 16:54  [ТС]     new , delete (двумерный динамический массив) #11
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 минут
может я чего напутал или это еще от системы зависит , потому что он мне все равно эту ошибку выдает((((((((((((((((((((
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
03.12.2012, 16:58     new , delete (двумерный динамический массив) #12
Строки 16-17
C++
1
2
3
for (int i=0; i<n; i++)
{
    for (int j=0; j<n; j++)
Почему в обоих циклах n?

Добавлено через 1 минуту
Очистку памяти тоже неверно делаешь. Зачем delete[] mas - в цикле?
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 17:07  [ТС]     new , delete (двумерный динамический массив) #13
Цитата Сообщение от Schizorb Посмотреть сообщение
Почему в обоих циклах n?
так а что там должно стоять?
Понял! Там должно вместо быть в первом цикле m , а во втором n !
или нет?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
03.12.2012, 17:08     new , delete (двумерный динамический массив) #14
Так массив то у тебя не квадратный(n на n), а прямоугольный m на n!!!
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
03.12.2012, 17:11     new , delete (двумерный динамический массив) #15
Ну если у тебя m строк и n столбцов, то ты как думаешь?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
03.12.2012, 17:13     new , delete (двумерный динамический массив) #16
Цитата Сообщение от certykys Посмотреть сообщение
Понял! Там должно вместо быть в первом цикле m , а во втором n !
или нет?
Именно так.
По поводу удаления - сначала освобождаем всю память, на которую указывают m указателей.
C++
1
2
for ( int i = 0; i < m; i++ )
   delete [] mass[ i ];
А потом, после цикла, освобождаем память, которая была выделена под сами указатели.
C++
1
delete [] mass;
certykys
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 10
03.12.2012, 17:17  [ТС]     new , delete (двумерный динамический массив) #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;
спасибо))))))))))
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
03.12.2012, 18:30     new , delete (двумерный динамический массив) #18
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;
}
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
03.12.2012, 20:12     new , delete (двумерный динамический массив) #19
Я бы так сделал
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;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2012, 20:17     new , delete (двумерный динамический массив)
Еще ссылки по теме:

Динамический Двумерный массив C++
Динамический двумерный массив C++
Двумерный динамический массив C++

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

Или воспользуйтесь поиском по форуму:
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
03.12.2012, 20:17     new , delete (двумерный динамический массив) #20
go, крутяк
Yandex
Объявления
03.12.2012, 20:17     new , delete (двумерный динамический массив)
Ответ Создать тему
Опции темы

Текущее время: 20:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru