Задать вопрос
volkovecgenei
@volkovecgenei
...

Почему выкидывает ошибку «нарушение прав доступа» и деление на ноль, но ноля нет?

Не могу понять почему выкидывает ошибку "нарушение прав доступа при чтении по адресу", причем в разных местах
И деление на ноль при поиске детерминанта?

#include <iostream>
#include <string>

using namespace std;

//Создаем класс для матрицы
template <typename T>
class Matrix {
private:
	//Поля
	int size;
	T** matrix;

	//Метод для выделения памяти
	void set() {
		//Выделить память для матрицы
		//Выделить пам'ять для массива указателей
		this->matrix = (T**) new T * [size]; //Количество строк, количество указателей

		//Выделить память для каждого указателя
		for (int i = 0; i < size; i++) {
			this->matrix[i] = (T*) new T[size];
		}
	}

	//Метод очистки памяти
	void clear() {
		for (int i = 0; i < size; i++) {
			delete[] matrix[i];
		}
		delete[] matrix;
	}

	void clear(T** arr, int size)
	{
		for (int i = 0; i < size; i++)
			delete[] arr[i];
		delete[] arr;
	}
public:
	//Конструктор без аргументов
	Matrix()
	{
		//Задаем размер
		this->size = 3;
		//Выделяем память
		set();
		//Заполняем матрицу
		full(0);
	}
	//Конструктор заполняющий матрицу переданным числом
	Matrix(T n) {
		//Задаем размер
		this->size = 3;
		//Выделяем память
		set();
		//Заполняем матрицу
		full(n);

		//cout << "Determinant: " << det(this->matrix, size) << endl;
	}
		
	//Метод заполнения матрицы
	void full(T n) {
		for (int i = 0; i < size; i++)
		{
			for (int j = 0; j < size; j++)
			{
				this->matrix[i][j] = n;
			}
		}
	}

	//Метод для вывода информации о матрице
	void print() {
		string result = "Size: " + to_string(size) +  "\r\n[\r\n";

		for (int i = 0; i < size; i++)
		{
			result += "\t";

			for (int j = 0; j < size; j++)
			{
				result += to_string(matrix[i][j]) + " ";
			}

			result += "\r\n";
		}
		
		result += "]\r\n";

		cout << result;
	}

	//Геттер
	int getSize() {
		return size;
	}
	
	//Метод изменения элеметнов матрицы
	void put(int i, int j, T n) {
		//Проверка на соответствие
		if ((i < 0) || (i >= size) || (j < 0) || (j >= size)) {
			return;
		}
			
		matrix[i][j] = n;
	}

	T get(int i, int j) {
		return matrix[i][j];
	}

	//создать копию массива
	T** clone(T** arr, int n)
	{
		T** newArr = new T* [n];
		for (int row = 0; row < n; row++)
		{
			newArr[row] = new T[n];
			for (int col = 0; col < n; col++)
				newArr[row][col] = arr[row][col];
		}
		return newArr;
	}

	double det(T** mat, int n) //квадратная матрица размера n*n
	{
		print();
		T** B = clone(mat, n);
		//приведение матрицы к верхнетреугольному виду
		for (int i = 0; i < n - 1; i++)
			for (int j = i + 1; j < n; j++)
			{
				cout << i << "-i, " <<  B[i][i] << endl;
				double coeff = -B[j][i] / B[i][i]; //метод Гаусса
				cout << coeff << endl << endl; 
				for (int k = i; k < n; k++)
					B[j][k] += B[i][k] * coeff;
			}
		//Рассчитать определитель как произведение элементов главной диагонали
		double Det = 1;
		for (int i = 0; i < n; i++)
			Det *= B[i][i];
		//Очистить память
		clear(B, n);
		return Det;
	}

	//Работа с операторами
	T* operator[] (int n) {
		T* arr = new T [size];

		for (int i = 0; i < size; i++)
		{
			arr[i] = matrix[n][i];
		}

		return arr;
	}

	Matrix operator= (Matrix m) {

		clear();

		// Копирование данных M <= _M
		size = m.getSize();


		set();

		//Заполним значениями
		for (int i = 0; i < size; i++) {
			for (int j = 0; j < size; j++) {
				matrix[i][j] = m[i][j];
			}
		}			

		return *this;
	}
	
	Matrix operator+ (Matrix m) {

		Matrix<T> newMatrix;

		for (int i = 0; i < size; i++)
		{
			for (int j = 0; j < size; j++)
			{
				newMatrix.put(i, j, matrix[i][j] + m[i][j]);
			}
		}

		return newMatrix;
	}

	Matrix operator- (Matrix m) {

		Matrix<T> newMatrix;
		
		for (int i = 0; i < size; i++)
		{
			for (int j = 0; j < size; j++)
			{
				newMatrix.put(i, j, matrix[i][j] - m[i][j]);
			}
		}


		return newMatrix;
	}

	Matrix operator* (Matrix m) {

		Matrix<T> newMatrix;

		int sum = 0;

		for (int i = 0; i < size; i++)
		{

			for (int j = 0; j < size; j++)
			{
				sum = 0;

				for (int k = 0; k < size; k++)
				{
					sum += matrix[i][k] * m[k][j];
				}

				newMatrix.put(i, j, sum);
			}
		}
		
		return newMatrix;
	}

	bool operator== (Matrix m) {
		for (int i = 0; i < size; i++)
		{
			for (int j = 0; j < size; j++)
			{
				if (matrix[i][j] != m[i][j])
				{
					return false;
				}
			}
		}

		return true;
	}

	//Деструктор - освобождает память, выделенную для матрицы
	~Matrix()
	{
		clear();
	}
};


int main()
{
	Matrix<int> matrix(1);
	matrix.print();

	matrix.put(0, 0, 3);
	matrix.print();
	
	//cout << matrix[0][1] << endl;

	Matrix<int> matrix2(2);
	matrix2.print();

	Matrix<int> matrix3;

	matrix3 = matrix * matrix2;
	matrix3.print();

	matrix2.full(2);
	matrix3.full(2);

	if (matrix2 == matrix3)
	{
		cout << "Matrices are equal" << endl;
	} else {
		cout << "Matrices are not equal" << endl;
	}

	//cout << "Determinant: " << matrix.getDeterminant() << endl;

	return 0;
}
  • Вопрос задан
  • 71 просмотр
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
Берёте дебаггер и по шагам выполняете код.
Вместо вас тут никто отладкой заниматься не будет
Ответ написан
Комментировать
В строке
double coeff = -B[j][i] / B[i][i];
что будет, если B[i][i] равно нулю?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы