0

我的程序由两个类组成。第一个创建一个二维数组并用用户输入填充它。第一个类工作正常,当我在 main 中调用它时,它能够创建和打印一个二维数组。但是,我试图将指向该二维数组的指针传递给第二个函数来计算矩阵的行列式。但是,在调用行列式函数后,我的程序不断崩溃。为什么我无法对这些数组元素进行乘法、加法或减法?

这是行列式类的实现文件:

#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);
4

1 回答 1

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 应该包含和控制其数据,而不是盲目地将其传递给任何询问的人。如果有人想计算行列式,他们应该调用一个Matrix::determinant返回行列式的方法。

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

于 2016-09-28T04:58:51.440 回答