Такая мысль тоже была, но:
1) если передавать матрицу в функцию через указатель, то с sizeof не всё так гладко.
2) если матрица квадратная, например 4х4, проблем не будет. Получаем размер массива (16), извлекаем корень (4), получаем матрицу 4х4, всё ок. Но если матрица не квадратная? Например, 4х3. Размер массива будет 12. Корень из 12-и не извлекается, там будет 3,46, и дробная часть от бросится. В итоге получим матрицу 3х3, что неверно.
Способ с ЛОРа не плох, но не спешу им воспользоваться. Идея со структурой мне больше понравилась.
Описал такую структуру (просьба не придираться к русским комментариям):
Код:
#define matrixType int
#define pMatrixType matrixType **
struct MATRIX {
// конструктор по умолчанию
MATRIX(const unsigned short m_, const unsigned short n_) : M(m_), N(n_) { }
// матрица
pMatrixType w;
// размер матрицы (MxN)
const unsigned short M;
const unsigned short N;
};
Метод создания матрицы. Принимает размер матрицы, возвращает указатель на созданную матрицу
Код:
MATRIX *makeMatrix(unsigned short m, unsigned short n) {
// минимальный размер матрицы 1х1
if(m <= 0) {
m = 1;
}
if(n <= 0) {
n = 1;
}
MATRIX *matrix = new MATRIX(m, n);
// собственно, создание матрицы
matrix->w = new(matrixType * [matrix->M]);
for(int i = 0; i < matrix->M; i++) {
matrix->w[i] = new(matrixType[matrix->N]);
}
if(!matrix->w) {
delete matrix;
return nullptr;
}
// заполнение матрицы нулями
for(int i = 0; i < matrix->M; i++) {
for(int j = 0; j < matrix->N; j++) {
matrix->w[i][j] = 0;
}
}
// список хранит указатели матриц в динамической памяти
// определён, как std::list<struct MATRIX *> m_matrixList;
m_matrixList.push_back(matrix);
return matrix;
}
Список m_matrixList лишь содержит указатели на объекты структуры в динамической памяти. Освобождение памяти происходит в методе clear():
Код:
void clear() {
for(auto it = begin(m_matrixList); it != end(m_matrixList); ++it) {
// удаление матрицы
for(int i = 0; i < (*it)->M; i++) {
delete (*it)->w[i];
}
delete [](*it)->w;
// удаление объекта структуры
delete *(it);
}
// ну и напоследок, очистка списка
m_matrixList.clear();
}
Интересует Ваше мнение по поводу этого кода, а так же возможные рекомендации по улучшению кода.
Благодарю.