在C ++中计算指向2D数组的指针的行列式

时间:2016-09-28 02:33:58

标签: c++ arrays pointers multidimensional-array determinants

我的课程由两节课组成。第一个创建一个2D数组并用用户输入填充它。第一个类正常工作,当我在main中调用它时,它能够创建和打印2D数组。但是,我试图将指向该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);

1 个答案:

答案 0 :(得分:0)

致电后

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

tempPoint指向int s的一维数组

calculate.determinant(&tempPoint, squareSize);

然后将此指针的地址转换为1D数组并在其中使用它,就像它是指向2D数组的指针一样。

这样看:假设你在地址1000有一个数组。tempPoint包含这个地址。你可以说tempPoint == 1000

tempPoint位于自动存储中,很可能是堆栈,并且拥有它自己的地址,因此程序可以找到它,例如1000000.这意味着&tempPoint是1000000,所以内部Det::determinant pointerToArray内部地址为1000000,并且位于地址1000处的数据阵列附近。Det::determinant在错误的内存中肆虐,没有人知道会发生什么。在你的情况下,该计划繁荣和死亡,但它也可能跛行在数周内错误的吐出错误的结果。如果这是在空中交通管制系统中,Crom会帮助我们。

如何解决这个问题:

Matrix::readMatrix需要返回Det::determinant可以使用的2D数组。

但是......这个程序的结构方式并没有经过深思熟虑。 Matrix应该包含并控制其数据,而不是盲目地将它传递给任何要求的人。如果有人想要计算行列式,他们应该调用返回行列式的Matrix::determinant方法。

破解文本并重新阅读封装部分。如果您没有文字或文字难以理解,请阅读The Definitive C++ Book Guide and List中的一本初学者书籍。相信我,从长远来看,它将为您节省大量时间。