【问题标题】:Calculating the determinant of a pointer to a 2D array in C++在 C++ 中计算指向二维数组的指针的行列式
【发布时间】:2016-09-28 02:33:58
【问题描述】:

我的程序由两个类组成。第一个创建一个二维数组并用用户输入填充它。第一个类工作正常,当我在 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);

【问题讨论】:

  • 为什么要使用没有状态(成员变量)的类?丢掉这门课,把determinant 变成free function。更少的混乱,更少的大惊小怪,更少的开销。重新思考,为什么不将行列式移入 Matrix 类?似乎是对矩阵执行的逻辑运算。
  • 这实际上是我的第一个想法。这是一个学校作业,要求指定两个头文件,两个实现文件,以及一个主文件。
  • 有趣。你可能想和导师一起提出这个问题。他们可能有一些鬼鬼祟祟的想法,但他们也可能教你像笨蛋一样编写代码。很高兴知道哪个,这样您就可以相应地调整您的学习期望和编码风格。

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


【解决方案1】:

调用后

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

tempPoint 指向ints 的一维数组

calculate.determinant(&tempPoint, squareSize);

然后将此指针的地址指向一维数组并在内部使用它,就好像它是指向二维数组的指针一样。

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

tempPoint 位于自动存储中,很可能是堆栈,并且有自己的地址,因此程序可以找到它,例如 1000000。这意味着 &amp;tempPoint 是 1000000,所以在 Det::determinant 内部 pointerToArray 是地址 1000000,这与位于地址 1000 的数据阵列相去甚远。Det::determinant 横冲直撞穿过错误的内存,没有人知道会发生什么。在您的情况下,该程序会蓬勃发展并死亡,但它也可能会在数周内因吐出错误结果而瘫痪。如果这是在空中交通管制系统中,Crom 可以帮助我们。

如何解决这个问题:

Matrix::readMatrix 需要返回一个二维数组,Det::determinant 可以使用。

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

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

【讨论】:

    猜你喜欢
    • 2017-06-11
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2016-05-08
    • 1970-01-01
    相关资源
    最近更新 更多