Вызвано исключение по адресу 0x00007FF6692B7628 в *.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000000FDFDFDFD
#include<iostream>
#include<math.h>
#include<random>
using namespace std;
class matrix{
public:
double** x;
int row;
int line;
void CrateMatrix(int l, int r) {
row = r;
line = l;
x = new double* [line];
for (int i = 0; i < line; i++) {
x[i] = new double[row];
//for (int j = 0; j < row; j++) {
// x[i][j] =1 /*m[j]*/;
//}
}
}
void fillmatrix() {
for (int i = 0; i < line; i++) {
for (int j = 0; j < row; j++) {
x[i][j] = rand() % 10;
}
}
}
matrix operator * (matrix& v) {
if (this->row != v.line) {
std::cout << "errr lime and row" << std::endl;
}
matrix c;
int m = v.row;
int n =v.line;
int p = this->line;
c.CrateMatrix(m, p);
for (int i = 0; i < m; i++) {
for (int j = 0; j < p; j++) {
double sum = 0;
for (int k = 0; k < n; k++) {
sum +=this->x[i][k];
}
cout << " sum =:" << " " << sum << endl;
c.x[i][j]= sum;
}
}
return c;
}
void out() {
for (int i = 0; i < line; i++) {
for (int j = 0; j < row; j++) {
cout << x[i][j] << " " << '\t';
}
cout << endl;
}
}
};
int main(){
srand(0);
matrix a;
a.CrateMatrix(2, 3);
a.fillmatrix();
a.out();
matrix b;
matrix d;
b.CrateMatrix(3, 4);
b.fillmatrix();
b.out();
d = a * b;
d.out();
std::cout << " end ";
return 0;
}
Ответы (2 шт):
Перепишите один фрагмент вот так:
for (int k = 0; k < n; k++) {
assert(i < this->row && k < this->line);
sum +=this->x[i][k];
}
и убедитесь, что вы вылетаете за пределы вашей матрицы.
Что делать? Переписать аккуратно... По-моему, вы запутались, что у вас столбец, а что строка - и немудрено: назвали-то вы их одинаково: line и row... При создании ("Crate" :)) line у вас число строк, row - число столбцов.
Например, при умножении матриц должна получиться матрица с числом строк, как в первой, и столбцов, как во второй - а у вас
int m = v.row;
int p = this->line;
c.CrateMatrix(m, p);
вроде как наоборот...
Вообще вот переделанная ваша функция:
matrix operator * (matrix& v) {
if (this->row != v.line) {
std::cout << "errr lime and row" << std::endl;
}
matrix c;
int m = v.row;
int n = v.line;
int p = this->line;
c.CrateMatrix(p, v.row);
for (int i = 0; i < line; i++) {
for (int j = 0; j < v.row; j++) {
double sum = 0;
for (int k = 0; k < row; k++) {
sum += this->x[i][k] * v.x[k][j];
}
cout << " sum =:" << " " << sum << endl;
c.x[i][j] = sum;
}
}
return c;
}
Уже со строчкой: sum += this->x[i][k] * v.x[k][j];
Если конечно я вас правильно понял, то line у вас строка, а row это столбцы. Лучше переименовать их как line = row, а вот row = col