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

Класс "Двумерный динамический массив"

30.09.2014, 16:38. Показов 3416. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа вылетает при вызове деструктора. Подскажите почему это происходит.
Кликните здесь для просмотра всего текста

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
private:
    size_t m_row;
    size_t m_column;
 
    int** m_matrix;
public:
    explicit Matrix(size_t row = 0, size_t column = 0);
    ~Matrix();
 
 
 Matrix::Matrix(size_t row, size_t column)
{
    m_row = row;
    m_column = column;
 
    m_matrix = new int*[m_column];
 
    for (size_t i = 0; i < m_column; i++)
    {
        m_matrix[i] = new int[m_row];
    }
}
 
 
 Matrix::~Matrix()
 {
     for (size_t i = 0; i < m_column; i++)
     {
         delete m_matrix[i];
 
     }
 
     delete m_matrix;
 }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.09.2014, 16:38
Ответы с готовыми решениями:

Шаблонный класс, определяющий двумерный динамический массив
Прошу помощи Задание: Создайте шаблонный класс, определяющий двумерный динамический массив, тип элементов которого задается аргументом...

Создать шаблонный класс - двумерный динамический массив
Задание:Создать шаблонный класс - двумерный динамический массив. Тип элементов массива определяется параметром шаблона. Предусмотреть...

Cоздать шаблонный класс TMatrix, реализующий динамический двумерный массив
Напишите программу, в которой создайте шаблонный класс TMatrix, реализующий динамический двумерный массив и функции-методы: ...

16
 Аватар для Nevermind_qqq
73 / 59 / 41
Регистрация: 25.06.2014
Сообщений: 360
30.09.2014, 16:52
а так?
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
private:
    size_t m_row;
    size_t m_column;
 
    int** m_matrix;
public:
    explicit Matrix(size_t row = 0, size_t column = 0);
    ~Matrix();
 
 
 Matrix::Matrix(size_t row, size_t column)
{
    m_row = row;
    m_column = column;
 
    m_matrix = new int*[m_column];
 
    for (size_t i = 0; i < m_column; i++)
    {
        m_matrix[i] = new int[m_row];
    }
}
 
 
 Matrix::~Matrix()
 {
     delete [] m_matrix;
 }
0
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
30.09.2014, 16:56  [ТС]
Nevermind_qqq, так не вылетает. Насколько это корректно? Двумерный массив - это массив массивов. Не происходить ли в вашем случае учетчики памяти?
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
30.09.2014, 17:32
Цитата Сообщение от Nevermind_qqq Посмотреть сообщение
C++
1
2
3
4
Matrix::~Matrix()
 {
     delete [] m_matrix;
 }
Удалять тогда тоже циклом
C++
1
2
3
for(size_t i = 0; i < m_row; ++i)
    delete[] m_matrix[i];
delete[] m_matrix;
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
30.09.2014, 18:11
Цитата Сообщение от schoolboy_ Посмотреть сообщение
Не происходить ли в вашем случае учетчики памяти?
Происходит, будь уверен.
Да и код тот без конструктора копирования и оператора присваивания до конца корректным нельзя считать.

Добавлено через 57 секунд
А еще гарантия безопасности исключений отсутствует.
1
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
01.10.2014, 18:28  [ТС]
Почему программа вылетает при вызове оператора умножения?
Кликните здесь для просмотра всего текста

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
Matrix Matrix::operator*(const Matrix& a)
 {
     Matrix result(m_row, a.m_column);
 
     for (size_t row = 0; row < m_row; row++)
     {
         for (size_t col = 0; col < a.m_column; col++)
         {
             for (size_t inner = 0; inner < m_column; inner++)
             {
                 result.m_matrix[row][col] += m_matrix[row][inner] * a.m_matrix[inner][col];
             }
 
         }
     }
 
 return result;
 }
 
Matrix& Matrix::operator=(const Matrix& a)
 {
     if (this == &a)
         return *this;
 
     
     for (size_t i = 0; i < m_row; ++i)
     {
         delete[] m_matrix[i];
     }
     
     delete[] m_matrix;
 
     m_matrix = new int*[a.m_row];
 
     for (size_t i = 0; i < m_row; i++)
     {
         m_matrix[i] = new int[a.m_column];
     }
         
 
     for (size_t i = 0; i < m_row; i++)
     {
         for (size_t j = 0; j < m_column; j++)
         {
             m_matrix[i][j] = a.m_matrix[i][j];
         }
         
     }
 
     return *this;
 }
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.10.2014, 19:30
Цитата Сообщение от schoolboy_ Посмотреть сообщение
Почему программа вылетает при вызове оператора умножения?
Конструктор копирования реализовал?
0
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
01.10.2014, 20:00  [ТС]
DrOffset, угу...
Зачем здесь конструктор?
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Matrix::Matrix(Matrix& a)
 {
      m_matrix = new int*[a.m_row];
 
      for (size_t i = 0; i < a.m_column; i++)
      {
          m_matrix[i] = new int[m_column];
      }
 
      for (size_t i = 0; i < m_row; i++)
      {
          for (size_t j = 0; j < m_column; j++)
          {
              m_matrix[i][j] = a.m_matrix[i][j];
          }
 
      }
 
 }
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.10.2014, 20:18
Цитата Сообщение от schoolboy_ Посмотреть сообщение
Зачем здесь конструктор?
Он нужен здесь (при возврате из функции умножения):
Цитата Сообщение от schoolboy_ Посмотреть сообщение
return result;
Как вызываешь умножение покажи.

Добавлено через 7 минут
Цитата Сообщение от schoolboy_ Посмотреть сообщение
for (size_t inner = 0; inner < m_column; inner++)
А еще вот здесь проблема:
C++
1
for (size_t inner = 0; inner < m_column; inner++)
потому что если m_column если у первого аргумента умножения больше такового у второго, то получим выход за пределы вот здесь (a.m_matrix[inner][col]):
C++
1
result.m_matrix[row][col] += m_matrix[row][inner] * a.m_matrix[inner][col];
В общем этот код будет работать только на равных по размерности матрицах.
0
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
01.10.2014, 20:20  [ТС]
DrOffset, вот так:
C++
1
2
3
4
5
Matrix a(3,3);
Matrix b(3,3);
Matrix c(3,3);
 
c = a * b;
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.10.2014, 21:03
schoolboy_, Вижу твою ошибку. В конструкторе копирования ты забыл проинициализировать размерность новой матрицы.
Как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Matrix::Matrix(Matrix const & a)
    : m_row(a.m_row), m_column(a.m_column)
{
    m_matrix = new int*[a.m_row];
 
    for (size_t i = 0; i < a.m_column; i++)
    {
        m_matrix[i] = new int[m_column];
    }
 
    for (size_t i = 0; i < m_row; i++)
    {
        for (size_t j = 0; j < m_column; j++)
        {
            m_matrix[i][j] = a.m_matrix[i][j];
        }
    }
}
1
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
01.10.2014, 21:16  [ТС]
DrOffset, если вы начали мне помогать, то так хочется сесть вам на шею.
Почему генератор случайных чисел генерирует одинаковые числа для разных матриц.
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Matrix::fill()
 {
     std::mt19937 generator(time(0));
     std::uniform_int_distribution<int> uid(0, 100);
 
     for (size_t i = 0; i < m_row; i++)
     {
         for (size_t j = 0; j < m_column; j++)
         {
             m_matrix[i][j] = uid(generator);
         }
     }
 }
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
01.10.2014, 23:53
Цитата Сообщение от schoolboy_ Посмотреть сообщение
Почему генератор случайных чисел генерирует одинаковые числа для разных матриц.
А как ты это определил?
0
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
02.10.2014, 08:55  [ТС]
Сгенерировал.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
02.10.2014, 18:38
Цитата Сообщение от schoolboy_ Посмотреть сообщение
Почему генератор случайных чисел генерирует одинаковые числа для разных матриц.
Потому что seed для генератора один и тот же. Три вызова
C++
1
2
3
a.fill();
b.fill();
c.fill();
выполняются гораздо меньше секунды, следовательно time(0) возвращает все время одно и то же число.

Добавлено через 3 минуты
Сделай так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 void Matrix::fill(std::mt19937 & generator)
 {
     std::uniform_int_distribution<int> uid(0, 100);
 
     for (size_t i = 0; i < m_row; i++)
     {
         for (size_t j = 0; j < m_column; j++)
         {
             m_matrix[i][j] = uid(generator);
         }
     }
 }
///.......
     std::mt19937 generator(time(0));
     a.fill(generator);
     b.fill(generator);
     c.fill(generator);
Хотя гораздо лучше отказаться от секунд в качестве источника энтропии.
1
3 / 3 / 1
Регистрация: 02.03.2013
Сообщений: 231
02.10.2014, 22:39  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Хотя гораздо лучше отказаться от секунд в качестве источника энтропии.
тогда как?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
02.10.2014, 23:21
Цитата Сообщение от schoolboy_ Посмотреть сообщение
тогда как?
Посмотри повнимательнее random в std::, там есть все, что нужно.
Но в любом случае стоит вынести генератор из функции fill.

Добавлено через 4 минуты
schoolboy_, Также можно использовать средства платформы (я так понимаю у тебя windows), для получения псевдослучайных значений. Например QPC (для учебных задач хватит с головой):
C++
1
2
3
4
5
    LARGE_INTEGER Time;
    QueryPerformanceCounter(&Time);
 
    std::mt19937 generator(Time.QuadPart);
    std::uniform_int_distribution<int> uid(0, 100);
Добавлено через 7 минут

Не по теме:

Хотя (напишу для желающих меня покритиковать), я не считаю QueryPerformanceCounter хорошим решением для этих задач. И знаю про его проблемы на многопроцессорных системах. Но для задач ТС, скорее всего, его хватит.

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.10.2014, 23:21
Помогаю со студенческими работами здесь

Как сделать из статического массива, одномерный динамический массив и двумерный динамический массив
По условию: &quot;Дана прямоугольная матрица размера A × B. Найти строки с наибольшей и наименьшей суммой элементов. Вывести на печать найденные...

Создать динамический класс Book, содержащий динамический массив Authors
Мне нужно написать программу,а я не знаю как ее написать. Знаю, тут люди за кого-то не делают, укажите хотя бы направление. вот сама...

Создать динамический класс Book, содержащей динамический массив Authors
всем привет. может кто-то набросать код для такой вот задачи: Создать динамический класс Book, содержащей динамический массив...

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru