Не правильно работает перемножение матриц в классе, в чем может быть ошибка?
Почему не перемножает матрицы? Пробовал передавать сразу 3 параметра(матрицы A,B,C), все равно внутрь цикла не заходит и выводит ошибку segmentation fault, или ‘matrixMultiplic’ was not declared in this scope.
#include <cmath>
#include <iostream>
#include <random>
using namespace std;
template <class T> class Matrix {
public:
int sizeMatrix; // матрица квадратная
T **matrix;
public:
Matrix() {
sizeMatrix = 0;
matrix = new T *[sizeMatrix];
for (int i = 0; i < sizeMatrix; i++) {
matrix[i] = new T[sizeMatrix];
}
}
Matrix(int sizeMatrix) {
this->sizeMatrix = sizeMatrix;
matrix = new T *[sizeMatrix];
for (int i = 0; i < sizeMatrix; i++) {
matrix[i] = new T[sizeMatrix];
}
}
void fillMatrix() {
for (int i = 0; i < sizeMatrix; i++) {
for (int j = 0; j < sizeMatrix; j++) {
matrix[i][j] = (random() % 100) / 2.5;
}
}
}
Matrix matrixMultiplic(Matrix<T> &A, Matrix<T> &B) {
if (A.sizeMatrix != B.sizeMatrix) {
cout
<< "Количество столбцов матрицы A не равно количеству строк матрицы B"
<< endl;
return -1;
}
Matrix<T> C(sizeMatrix);
for (int i = 0; i < sizeMatrix; i++) {
cout << i << endl;
for (int j = 0; j < sizeMatrix; j++) {
C.matrix[i][j] = 0;
for (int k = 0; k < sizeMatrix; k++) {
C.matrix[i][j] += A.matrix[i][k] * B.matrix[k][j];
}
}
}
return C;
}
void printMatrix() {
for (int i = 0; i < sizeMatrix; i++) {
for (int j = 0; j < sizeMatrix; j++) {
cout << matrix[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
};
int main() {
Matrix<int> A(3);
A.fillMatrix();
Matrix<int> B(3);
B.fillMatrix();
A.printMatrix();
B.printMatrix();
Matrix<int> C();
C = matrixMultiplic(A, B);
}
Ответы (1 шт):
Начнем с мелочей — не random(), а rand(). Ваша функция matrixMultiplic — член класса, значит, должна предваряться именем объекта с точкой. Объявление Matrix<int> C(); — это объявление функции, возвращающей Matrix... Конструктор по умолчанию пытается выделять нулевого размера память. Нет нормального деструктора, копирующего конструктора и т.п. — а значит, проблемы с памятью неизбежны! Явно это не все, что-то я пропустил, но это бросается в глаза.
Ну, а само умножение... Я бы сделал его оператором вне класса, примерно так —
template<class T>
Matrix<T> operator *(const Matrix<T> &A, const Matrix<T> &B)
{
if (A.sizeMatrix != B.sizeMatrix) throw("Количество столбцов матрицы A не равно количеству строк матрицы B");
Matrix<T> C(A.sizeMatrix);
for (int i = 0; i < A.sizeMatrix; i++)
{
for (int j = 0; j < A.sizeMatrix; j++)
{
C.matrix[i][j] = 0;
for (int k = 0; k < A.sizeMatrix; k++) {
C.matrix[i][j] += A.matrix[i][k] * B.matrix[k][j];
}
}
}
return C;
}
Раз уж у вас все члены открыты...
Ну, а в коде main
Matrix<int> C;
C = A*B;
C.printMatrix();
Вот только еще раз — без правильных конструктора копирования, оператора присваивания и деструктора — все это работать нормально не будет!