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

Выделение памяти под матрицу

24.12.2011, 17:57. Показов 2887. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.

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
float   **AllocMat(int Rows, int Colomns)
                        {
                         float ** Mat;
                         try
                         {
                          Mat = new float * [Rows];
                          if( Mat == NULL ) throw 0;
                          for (int i = 0; i < Rows; i++)
                          {
                           Mat[i] = new float [Colomns];
                           if( Mat[i] == NULL ) throw i;
                          }
                         }
                            catch( int index )
                            {
                            cout << "Ошибка выделения памяти" <<endl;
                          for (int i = 0; i < index; i++)
                          {
                           delete [] Mat[i];
                           Mat[i] = NULL;
                          }
                          return NULL;
                            }
                         return Mat;}
Собственно вопрос будет ли освобождаться память из под **Mat втоматически по завершении работы функции?Мне кажеться что нет ( читал что в классах для всех указателей нужно писать деструктор). Если я прав то как мне выйти из положения, ведь очистить до возврата я не могу, а после нет к ниму доступа. Заранее благодарен.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.12.2011, 17:57
Ответы с готовыми решениями:

Выделение памяти под матрицу
Существует такой класс: class matr{ public: double **m; // адрес матрицы int mi, my; //стобцы, строки //функции ...

Выделение памяти под матрицу
Всем доброго времени суток! Есть такая проблема, у меня есть свой класс Cell. Мне нужно создать матрицу объектов этого типа и выделить под...

Выделение памяти под матрицу в конструкторе
Почему компилятор подчеркивает эту строку?mCells = new GamePiece; //GameBoard.cpp #include &quot;GameBoard.h&quot; const int...

4
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
24.12.2011, 18:03
Да, память выделяется в куче... Будет утечка памяти.
Цитата Сообщение от vasyapupkin89 Посмотреть сообщение
а после нет к ниму доступа.
С чего это?
0
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 15
24.12.2011, 18:16  [ТС]
ну так ведь функция будет завершена, а ** Mat локальный обьект... Я так думал... А каким образом это можно сделать??

Добавлено через 6 минут
все дописал после return Mat, вродь работает. Спасибо))))))
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
24.12.2011, 18:19
Цитата Сообщение от vasyapupkin89 Посмотреть сообщение
return Mat;}
Так Вы же его вернули.
C++
1
2
3
4
5
6
7
8
// Где-то в main
 
int **a = AllocMat (10, 20);
// Поработали с ним
//Когда уже не нужен
for ( int i = 0 ; i < 10 ; ++i )
    delete []a[i];
delete []a;
0
0 / 0 / 0
Регистрация: 21.12.2011
Сообщений: 15
24.12.2011, 18:25  [ТС]
go,

Открою вам всю душу, тогда получаеться у меня все хорошо.
И еше оператор перегрузки прокоментируйте пожалуйста.

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
#include <windows.h>
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
#include <tchar.h>
#include <iomanip.h>
//---------------------------------------------------------------------------
    class matrix    {
        float **mat;
            char n;
             int Rows,Cols;
 
        float   **AllocMat(int Rows, int Colomns)
                        {
                         float ** Mat;
                         try
                         {
                          Mat = new float * [Rows];
                          if( Mat == NULL ) throw 0;
                          for (int i = 0; i < Rows; i++)
                          {
                           Mat[i] = new float [Colomns];
                           if( Mat[i] == NULL ) throw i;
                          }
                         }
                            catch( int index )
                            {
                                cout << "Помилка виділення пам`яті" << endl;
                          for (int i = 0; i < index; i++)
                          {
                           delete [] Mat[i];
                           Mat[i] = NULL;
                          }
                          return NULL;
                            }
                         return Mat;
 
                          
 
                        }
       public:
        matrix(){
 
                          cout<<"\nНазвіть матрицю одним символом-->";
                           n=getch();
                           cout<<n;
                        cout<<"\n\nВведіть кількість рядків матриці -->";
                         cin>>Rows;
                            cout<<"\nВведіть кількість стовпчиків матриці -->";
                         cin>>Cols;
                                   mat=AllocMat(Rows,Cols);
 
                         cout<<"\nВиберіть спосіб ініціалізації матриці\n1 - Aвтоматично(випадковими числами.\n2 - Bручну.\n";
 
                         int i=0 ;
                        while (i<1) {     char d=getch();
                                            srand(time(0));
                                            if ('1'==d) {  for (int i = 0; i < Rows; i++) {
                                                                     for (int j = 0; j < Cols; j++) {
 
                                                                                                   mat[i][j]=random(100);
                                                                                                    }
                                                                                            }
                                                                                    i=3;}
 
                                            if ('2'==d) {  for (int i = 0; i < Rows; i++) { cout<<endl;
                                                                     for (int j = 0; j < Cols; j++) {
                                                                                                  cout<<n<<"["<<i<<"]["<<j<<"]-->";
                                                                                                  cin>>mat[i][j];
                                                                                                        }
 
                                                                                                }
                                                                                 i=3;   }
                                            };
        }
         void print_m(){
         cout<<"\n\t\tМатриця "<<n<<endl;
         for (int i = 0; i < Rows; i++) { cout<<endl;
            for (int j = 0; j < Cols; j++) {
                cout<<setw(5)<<left<<mat[i][j];
                }
            }
         }
        matrix (const matrix &a) { mat=AllocMat(a.Rows,a.Cols);
                  Rows=a.Rows;
                  Cols=a.Cols;
                  n=a.n;
                 for (int i = 0; i < Rows; i++) {
                       for (int j = 0; j < Cols; j++) {
                           mat[i][j]=a.mat[i][j];
                       }
                       }
                  }
     ~matrix (){
 
            for (int i = 0; i < Rows; i++)
                {
                    delete [] mat[i];
                    mat[i] = NULL;
                }
        delete [] mat;
        mat = NULL;
        }
     matrix (int Rowss,int Colss){
                   Rows=Rowss;
                   Cols=Colss;
            mat=AllocMat(Rows,Cols); n='C';}
    matrix operator*(const matrix &t){
          if (Cols==t.Rows) { matrix temp(Rows,t.Cols);   cout<<"ok";
                   for (int q=0; q<Rows; q++)
                {
                        for (int f = 0; f<t.Cols; f++)
                                {
                                int sum=0;
                                   for (int u=0; u<Rows; u++)
                                 { sum+= mat[q][u]*t.mat[u][f];}
                 temp.mat[q][f]=sum;}
}
               return temp; }   else {cout<<"\n\nМноження матриць не можливе.Розміри матриць не співпадають!!!!!!!!!"; }
        }
    };
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{     SetConsoleCP(1251);
      SetConsoleOutputCP(1251);
         matrix mat1;
         mat1.print_m();
 
          matrix mat2;
         mat2.print_m();
 
         matrix mat3=mat1*mat2;
         mat3.print_m();
         system("pause");
    return 0;
}
//-----
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.12.2011, 18:25
Помогаю со студенческими работами здесь

Выделение памяти под динамическую матрицу в С
Люди помогите с 2 вопросами а то я чет не понимаю 1.Выделение памяти под динамическую матрицу в С(напише плиз как обьявлется матрица и...

Выделение памяти под структуру
enrollee *p=new enrollee; после работы delete p; выбивает ошибку. неправильно очищаю???

Выделение памяти под указатель
Здравствуйте! Есть следующий код. Я разбиваю строку на слова и слова заданной длины пытаюсь заменить на слово (символьный указатель str)...

Выделение памяти под wchar_t
вот такой код: char *str=new char; strcpy(str,&quot;stroka&quot;); int l=strlen(str); wchar_t *wstr=new wchar_t; mbstowcs(wstr,str,l); ...

Выделение памяти под массив
Требуется выделить память под матрицу. Будет ли следующий код работать корректно? //глобальная область int x_size = 3; ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
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 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru