尽管直接设置了指针数组,但仍为空

Array of pointers remaining null despite being directly set

本文关键字:数组 指针 设置      更新时间:2023-10-16

我有一个长度为 [sizeX][sizeY] 的 2d 数组中的"单元格"对象列表。这些Cell对象包含一个类型*Cell的数组,该数组应以北、东、南、西(永远不要吃湿漉漉的华夫饼(的格式指向每个给定单元格的相邻单元格。

这个数组称为compass,长度定义为4。初始化单元格后(此时compass的所有值都设置为nullptr(,我有一个循环,它试图用指向附近相应单元格的指针填充Cell.compass

但是,我发现尽管如此,在每个单元格中,我发现compass仍然充满了空值。

在这个循环中,我还运行了一个函数Cell::computeTopology()该函数填充compass的有效非空索引的向量(这是Cell的属性(。这同样是空的。

在调用此函数之前和之后,我都做了一个断点,效果完全相同。无论如何,我也会包括这个函数。我非常困惑,在这里提供一些帮助将不胜感激。

问题区域:

const int sizeX = SCREEN_WIDTH / SCALE;
const int sizeY = SCREEN_HEIGHT / SCALE;
Cell cells[sizeX][sizeY];
for (int x = 0; x < sizeX; x++){
for (int y = 0; y < sizeY; y++){
cells[x][y].setPos(x, y);
cells[x][y] = Cell();
//cells[x][y].setColor(rand() % 255, rand() % 255, rand() % 255);
}
}
for (int x = 0; x < sizeX; x++) {
for (int y = 0; y < sizeY; y++) {
Cell c = cells[x][y];
if (x - 1 >= 0) {
c.compass[3] = &cells[x - 1][y];
}
if (x + 1 < (SCREEN_WIDTH / SCALE)) {
c.compass[1] = &cells[x + 1][y];
}
if (y - 1 >= 0) {
c.compass[0] = &cells[x][y - 1];
}
if (y + 1 < (SCREEN_HEIGHT / SCALE)) {
c.compass[2] = &cells[x][y + 1];
}
c.computeTopology();
}
}

computeTopology()功能

void Cell::computeTopology()
{
int i = 0;
for (Cell *c : compass) {
if (c != nullptr) {
notNull.push_back(i);
i++;
}
}
}

更改

Cell c = cells[x][y]; // make a copy

Cell& c = cells[x][y];

您要修改数组项,而不是复制。

另一个问题

cells[x][y].setPos(x, y);
cells[x][y] = Cell(); // ?

您通过调用setPos来设置cells[x][y]的某些成员,之后您将覆盖cells[x][y]默认情况下构造Cell对象。我认为应该删除上面代码中的第二行。


你的话

填充指南针的有效非空索引的向量(这是 Cell 的属性(

因此i索引应该随着 for 循环的每次迭代而前进:

int i = 0;
for (Cell *c : compass) {
if (c != nullptr) {
notNull.push_back(i);
}
++i; // moved
}