HLFX.Ru Forum
Показать все 14 сообщений этой темы на одной странице

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:
1
#ifndef MATRIX_H
2
#define MATRIX_H
3
 
4
#include <iomanip>
5
#include <iostream>
6
#include <cstdlib>
7
 
8
using std::endl; using std::cerr;
9
using std::ostream; using std::istream;
10
using std::setw;
11
 
12
class CMatrix
13
{
14
  friend ostream &operator<<(ostream&, const CMatrix&);
15
 
16
public:
17
  CMatrix(unsigned short = 3, unsigned short = 3);
18
  ~CMatrix();
19
 
20
  CMatrix& operator=(const CMatrix&);
21
 
22
  friend CMatrix operator+(const CMatrix &, const CMatrix &);
23
 
24
  void randfill(const unsigned short);
25
 
26
private:
27
  int **mptr;				//матрица элементов
28
  unsigned short rows;	//количество строк в матрице
29
  unsigned short cols;	//количество столбцов в матрице
30
};
31
 
32
typedef CMatrix matrix;
33
 
34
CMatrix::CMatrix(unsigned short m, unsigned short n)
35
{
36
  if(m==0) m=1;
37
  if(n==0) n=1;
38
  rows = m;
39
  cols = n;
40
  mptr = new int*[m];
41
  for (unsigned short i=0; i<m; i++)
42
    mptr[i]=new int[n];
43
 
44
  for (unsigned short i=0; i<m; i++)
45
    for (unsigned short j=0; j<n; j++)
46
      mptr[i][j]=0;
47
    return;
48
  }
49
 
50
CMatrix::~CMatrix()
51
{
52
  for (int i=0; i<rows; i++)
53
    delete[]mptr[i];
54
  delete[]mptr;
55
}
56
 
57
ostream &operator<<(ostream &output, const CMatrix &M)
58
{
59
  for (unsigned short i=0; i<M.rows; i++)
60
  {
61
    output << endl;
62
    for (unsigned short j=0; j<M.cols; j++)
63
      output << setw(4) << M.mptr[i][j];
64
  }
65
  output << endl;
66
  return output;
67
}
68
 
69
CMatrix& CMatrix::operator=(const CMatrix & right)
70
{
71
  if ((rows!=right.rows)||(cols!=right.cols))
72
  {
73
    cerr << "Error: assignment is not available for matrices of different sizes" << endl;
74
    return *this;
75
  }
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];
79
    return *this;
80
  }
81
 
82
CMatrix operator+(const CMatrix & first, const CMatrix & second)
83
{
84
  if((first.rows!=second.rows)||(first.cols!=second.cols))
85
  {
86
    cerr << "Error: addition is not available for matrices of different sizes" << endl;
87
    exit(1);
88
  }
89
  unsigned short m = first.rows;
90
  unsigned short n = first.cols;
91
  CMatrix M(m,n);
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];
95
    return M;
96
  }
97
 
98
void CMatrix::randfill(const unsigned short range)
99
{
100
  for (unsigned short i=0; i<rows; i++)
101
    for (unsigned short j=0; j<cols; j++)
102
      mptr[i][j]=rand()%range;
103
    return;
104
  }
105
#endif


Тестирующая программа:

C++ Source Code:
1
#include "stdafx.h"
2
#include "matrix.h"
3
using std::cout;
4
 
5
void main ()
6
{
7
  matrix A(2,2);
8
  A.randfill(10);
9
  matrix B(2,2);
10
  B.randfill(10);
11
  cout << A;
12
  cout << B;
13
  matrix C(2,2);
14
  C = A+B;
15
  cout << C;
16
  return;
17
}


Собственно, стопорится на присваивании 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'


Временная зона GMT. Текущее время 15:53.
Показать все 14 сообщений этой темы на одной странице

На основе vBulletin версии 2.3.0
Авторское право © Jelsoft Enterprises Limited 2000 - 2002.
Дизайн и программирование: Crystice Softworks © 2005 - 2024