gpt4 book ai didi

c++ - 二维数组(矩阵)中的错误访问错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:15:59 24 4
gpt4 key购买 nike

我有点小问题...我知道 EXC_BAD_ACCESS 错误是什么,我通常知道如何修复它,但这个问题让我完全被塞满了。我把这一切都放在一个类中,这是一种方法:

double Matrix::get_element(int r, int c) const {
//Retrieve the element at row r and column c
//Should not modify the value stored in Matrix but return a double copy of the value

double currentValue = matrix[r][c];
return currentValue;
}

现在,我有另一段调用此方法的代码:

std::string Matrix::to_string() const {
std::string result;
double current;
Matrix working = *this;
std::ostringstream oss;

oss << "[";
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
current = 0.0;
current = working.get_element(i, j);
oss << " " << current << " ";
}
oss << "; ";
}
oss << "]";
result = oss.str();
return result;
}

我知道工作对象在调用 working.get_element(i, j); 时有 3 行和 3 列。变量列表显示 get_element() 方法之前,行和列都设置为 3。在该方法中,我能够在 get_element(0, 0) 但不是 get_element(0, 1)

我不明白为什么会这样...有人知道为什么或需要更多我的代码来理解为什么调用这些方法吗?

编辑:这是头文件:

class Matrix {
private:
//Any variables required
int rows;
int cols;
double **matrix;

public:
Matrix(); //Working M
~Matrix(); //Working M
Matrix(int r, int c); //Working M

int getRows();
int getCols();

void set_element(int r, int c, double val); //Working M
double get_element(int r, int c) const; //Working M

void clear(); //Working M
bool is_empty(); //Working M
bool is_identity(); //Working M

const Matrix transpose(); //Working M
int minorMat(double **dest, const int row, const int col, int order); //Working M
double get_determinent(); //Working M
double higherDeterminents(int order); //Working M

const Matrix operator+(const Matrix &rhs); //Working M
const Matrix operator-(const Matrix &rhs); //Working M
const Matrix operator*(const Matrix &rhs);
bool operator==(const Matrix &rhs); //NOT assessed
const Matrix operator*(const double &rhs);
const Matrix operator/(const double &rhs);
Matrix & operator=(const Matrix &rhs);

std::string to_string() const;
};

抱歉,请忽略评论。这是构造函数/析构函数:

Matrix::Matrix() {
//Basic Constructor
rows = 1;
cols = 1;
matrix = new double*[rows];
for (int i = 0; i < rows; ++i) {
matrix[i] = new double[cols];
}
}

Matrix::~Matrix() {
//Basic Deconstructor
for (int i = 0; i < rows; ++i) {
delete[] matrix[i];
}
delete[] matrix;
rows = NULL;
cols = NULL;
matrix = NULL;
}

Matrix::Matrix(int r, int c) {
//Empty matrix (all 0's) with r rows and c columns, if they are -ve, set to 1
rows = r;
cols = c;

if (cols < 0)
cols = 1;
if (rows < 0)
rows = 1;

matrix = NULL;
matrix = new double*[rows];
for (int i = 0; i < rows; i++) {
matrix[i] = new double[cols];
}
}

编辑2:

Matrix & Matrix::operator=(const Matrix &rhs) {
//rhs is matrix to be copied
//rhs compied into Matrix called on
double toCopy;
for (int i = 0; i < rhs.rows; i++) {
for (int j = 0; j < rhs.cols; j++) {
toCopy = rhs.get_element(i, j);
this->set_element(i, j, toCopy);
}
}
return *this;
}

最佳答案

如果您不说明如何声明和初始化 matrix 元素,我们就无法说明。在你的 CTOR 中使用类似的东西应该没问题:

class Matrix {
float matrix[3][3];
...
}

不要忘记在您的 CTOR 中将其初始化为有意义的内容。

顺便说一句:你为什么这样做:Matrix working = *this; ??您可以简单地 this->get_element(i, j); 代替,这不会调用整个对象的复制。 [1]

编辑:自您更新答案后更新。您应该小心复制 CTOR 和 operator=() 语句。很容易进行双重删除或类似丑陋的操作。

EDIT2:我认为问题出在这一行:

Matrix working = *this;

您正在创建this 对象的新拷贝working。但是 working 仅使用 1 列和 1 行进行初始化(如标准 CTOR 中所定义)。我不确定您在调用 set_elementget_element 时是否正在检查边界,所以我猜您是在写数组的边界。

我认为最好的办法是删除 Matrix working = *this; 行并遵循我在上面的提示:this->get_element(i, j); in std::string Matrix::to_string() const

关于c++ - 二维数组(矩阵)中的错误访问错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7658219/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com