HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Флуд (https://hlfx.ru/forum/forumdisplay.php?forumid=11)
-- Вопрос по C++ (https://hlfx.ru/forum/showthread.php?threadid=2835)
Отправлено FreeSlave 20-05-2011 в 18:00:
Вопрос по C++
В заголовочном файле:
C++ Source Code:
8 | using std::endl; using std::cerr; |
9 | using std::ostream; using std::istream; |
14 | friend ostream &operator<<(ostream&, const CMatrix&); |
17 | CMatrix(unsigned short = 3, unsigned short = 3); |
20 | CMatrix& operator=(const CMatrix&); |
22 | friend CMatrix operator+(const CMatrix &, const CMatrix &); |
24 | void randfill(const unsigned short); |
27 | int **mptr; //матрица элементов |
28 | unsigned short rows; //количество строк в матрице |
29 | unsigned short cols; //количество столбцов в матрице |
32 | typedef CMatrix matrix; |
34 | CMatrix::CMatrix(unsigned short m, unsigned short n) |
41 | for (unsigned short i=0; i<m; i++) |
44 | for (unsigned short i=0; i<m; i++) |
45 | for (unsigned short j=0; j<n; j++) |
52 | for (int i=0; i<rows; i++) |
57 | ostream &operator<<(ostream &output, const CMatrix &M) |
59 | for (unsigned short i=0; i<M.rows; i++) |
62 | for (unsigned short j=0; j<M.cols; j++) |
63 | output << setw(4) << M.mptr[i][j]; |
69 | CMatrix& CMatrix::operator=(const CMatrix & right) |
71 | if ((rows!=right.rows)||(cols!=right.cols)) |
73 | cerr << "Error: assignment is not available for matrices of different sizes" << endl; |
76 | for (unsigned short i=0; i<rows; i++) |
77 | for (unsigned short j=0; j<cols; j++) |
78 | mptr[i][j]=right.mptr[i][j]; |
82 | CMatrix operator+(const CMatrix & first, const CMatrix & second) |
84 | if((first.rows!=second.rows)||(first.cols!=second.cols)) |
86 | cerr << "Error: addition is not available for matrices of different sizes" << endl; |
89 | unsigned short m = first.rows; |
90 | unsigned short n = first.cols; |
92 | for (unsigned short i=0; i<m; i++) |
93 | for (unsigned short j=0; j<n; j++) |
94 | M.mptr[i][j]=first.mptr[i][j]+second.mptr[i][j]; |
98 | void CMatrix::randfill(const unsigned short range) |
100 | for (unsigned short i=0; i<rows; i++) |
101 | for (unsigned short j=0; j<cols; j++) |
102 | mptr[i][j]=rand()%range; |
Тестирующая программа:
C++ Source Code:
Собственно, стопорится на присваивании C = A+B, а именно - в месте присваивания элемента mptr[i][j]=right.mptr[i][j]. При этом нормально проходит проверку на соответствие размера. Видимо M таки из operator+ возвращается, но деструктор убивает все данные (кроме размера) заранее. Пробовал оставить деструктор пустым - всё работает. Но в таком случае, насколько я понимаю, возможна утечка памяти. Как же побороть сию проблему?__________________
I'm on github
I'm on opendesktop.org
Отправлено Дядя Миша 20-05-2011 в 18:22:
FreeSlave кой дурак придумал маллокать матрицы динамически?
все равно для разной размерности будут разные методы взаимодействия.
не надо стремиться сделать единый универсальный класс матриц, надо завести несколько отделных. Обычно требуются 3х3, 3х4, и 4х4.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FreeSlave 20-05-2011 в 18:47:
Цитата:
Дядя Миша писал:
FreeSlave кой дурак придумал маллокать матрицы динамически?
все равно для разной размерности будут разные методы взаимодействия.
не надо стремиться сделать единый универсальный класс матриц, надо завести несколько отделных. Обычно требуются 3х3, 3х4, и 4х4.
И что ж теперь - десяток классов наследовать? Это же изврат.
К тому же это необязательно могут быть матрицы.__________________
I'm on github
I'm on opendesktop.org
Отправлено Government-Man 20-05-2011 в 19:24:
FreeSlave не надо там ничего наследовать... 
Отправлено Дядя Миша 20-05-2011 в 20:09:
Цитата:
FreeSlave писал:
И что ж теперь - десяток классов наследовать? Это же изврат.
изврат - это выделять 12 байт маллоком, да-да. Про фрагментацию памяти слышал?__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FreeSlave 20-05-2011 в 21:50:
Цитата:
Дядя Миша писал:
изврат - это выделять 12 байт маллоком, да-да. Про фрагментацию памяти слышал?
Наслышан.
Поборол проблему манипуляциями со static.__________________
I'm on github
I'm on opendesktop.org
Отправлено FreeSlave 21-05-2011 в 10:30:
Ё-моё, только сейчас вспомнил про шаблоны с нетиповыми параметрами. Через них ведь можно заносить данные о размерах массива. Буду переделывать. А статик всё равно имел кучу минусов.
__________________
I'm on github
I'm on opendesktop.org
Отправлено Дядя Миша 21-05-2011 в 11:47:
FreeSlave правильно понимаю, ты задался целью написать "самый лучший код" ? Ну, судя по категоричности твоих суждений.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено Government-Man 21-05-2011 в 14:53:
FreeSlave ты чего больше хочешь - класс матрицы реализовать или наконец-то написать шаблон с нетиповыми параметрами? 
Отправлено FreeSlave 21-05-2011 в 15:51:
Government-Man
Вообще первое, желательно с возможностью создавать матрицы любых размеров. А уж какими средствами это будет реализовано - вопрос второстепенный, хотя и не менее важный.
Дядя Миша
Я пишу для интереса. А "самых лучших кодов" не бывает наверно.
__________________
I'm on github
I'm on opendesktop.org
Отправлено Дядя Миша 21-05-2011 в 17:16:
Цитата:
FreeSlave писал:
Вообще первое, желательно с возможностью создавать матрицы любых размеров.
зачем?__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FreeSlave 21-05-2011 в 18:26:
Цитата:
Дядя Миша писал:
зачем?
Для универсальности. Мало ли каких размеров пригодится.__________________
I'm on github
I'm on opendesktop.org
Отправлено Government-Man 21-05-2011 в 19:10:
FreeSlave это от программы зависит. Если ты пишешь программу для сложных научных математических рассчетов - то конечно флаг тебе в руки. Если же 3д движок - то такая сложность там совершенно излишняя и скажется на производительности что самое печальное.
Отправлено Дядя Миша 21-05-2011 в 19:47:
Цитата:
FreeSlave писал:
Для универсальности. Мало ли каких размеров пригодится.
никому эта универсальность не нужна.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'