Вычисление определителя указателя на двумерный массив в переполнении стека

Моя программа состоит из двух классов. Первый создает 2D-массив и заполняет его пользовательским вводом. Первый класс работает правильно, и когда я вызываю его в main, он может создавать и печатать 2D-массив. Однако я пытаюсь передать указатель на этот двумерный массив второй функции, чтобы вычислить определитель матрицы. Тем не менее, моя программа продолжает сбой после вызова определяющей функции. Почему я не могу умножить, добавить или вычесть эти элементы массива?

Вот файл реализации для класса определителя:

#include <iostream>
#include "det.hpp"
using std::cout;
using std::endl;

Det::Det() {

};
int Det::determinant(int **pointerToArray, int arraySize) {
int determinant;
cout << "Calculating the determinant..." << endl;
if (arraySize == 2) {
determinant = (pointerToArray[0][0] * pointerToArray[1][1]) -
(pointerToArray[1][0] * pointerToArray[1][0]);
} else if (arraySize == 3) {
determinant = (pointerToArray[0][0] * ((pointerToArray[1][1] * pointerToArray[2][2]) -
(pointerToArray[1][2] * pointerToArray[2][1]))) -
(pointerToArray[0][1] * ((pointerToArray[1][0] * pointerToArray[1][1]) -
(pointerToArray[1][2] * pointerToArray[2][0]))) +
(pointerToArray[0][2] * ((pointerToArray[1][0] * (pointerToArray[2][1]) -
(pointerToArray[1][1] * pointerToArray[2][0])));
} else {
return determinant;
};
};

Вот как часть main, которую я называю функцией:

//this is the original object
Matrix* point = new Matrix();
//this is where I retrieve the data from the first function
int * tempPoint = point->readMatrix(newArray, squareSize);
/*this is where I call the determinant with
a pointer to the original array as a parameter*/
calculate.determinant(&tempPoint, squareSize);

0

Решение

После звонка

int * tempPoint = point->readMatrix(newArray, squareSize);

tempPoint указывает на одномерный массив ints

calculate.determinant(&tempPoint, squareSize);

затем берет адрес этого указателя в одномерный массив и использует его внутри, как если бы он был указателем на двумерный массив.

Посмотрите на это так: скажем, у вас есть массив по адресу 1000. tempPoint содержит этот адрес. Ты мог сказать это tempPoint == 1000,

tempPoint находится в автоматическом хранилище, скорее всего в стеке, и имеет собственный адрес, чтобы программа могла его найти, скажем, 1000000. Это означает &tempPoint 1000000, так что внутри Det::determinant pointerToArray это адрес 1000000, и это далеко не массив данных, расположенный по адресу 1000. Det::determinant бродит по неверной памяти, и никто не знает, что произойдет. В вашем случае программа взлетает и умирает, но она также может хромать на разбитых, выпуская неправильные результаты в течение нескольких недель. Crom поможет нам, если это в системе управления воздушным движением.

Как это исправить:

Matrix::readMatrix должен вернуть двумерный массив, который Det::determinant можешь использовать.

Но … Структура этой программы не очень хорошо продумана. Матрица должна содержать и контролировать свои данные, а не передавать их вслепую всем, кто спрашивает. Если кто-то хочет вычислить определитель, он должен назвать Matrix::determinant метод, который возвращает определитель.

Взломайте свой текст и перечитайте раздел «Инкапсуляция». Если у вас нет текста или текст непонятен, найдите и прочитайте одну из книг для начинающих из Полное руководство и список книг C ++. Поверьте мне, это сэкономит вам массу времени в долгосрочной перспективе.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]