我在二维数组中以长度[sizeX] [sizeY]列出了“单元格”对象。这些Cell
对象包含类型为*Cell
的数组,该数组应指向给定单元格的每个相邻单元格,格式为北,东,南,西(从不吃湿华夫饼干)。
此数组称为compass
,定义的长度为4。初始化单元格后(此时compass
的所有值都设置为nullptr
),我有一个循环,试图用指向附近合适的单元格的指针填充Cell.compass
。
但是,尽管如此,我发现在每个单元格中,compass
仍然充满空值。
在此循环中,我还运行了一个函数Cell::computeTopology()
,该函数填充了Cell
的有效非空索引的向量(其为compass
的属性)。同样是空的。
在调用此函数以达到完全相同的效果之前和之后,我都创建了一个断点。无论如何,我也将包括此功能。我非常困惑,这里的一些帮助将不胜感激。
问题区域:
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++;
}
}
}
答案 0 :(得分:0)
更改
Cell c = cells[x][y]; // make a copy
到
Cell& c = cells[x][y];
您要修改数组项,而不是复制项。
另一个问题
cells[x][y].setPos(x, y);
cells[x][y] = Cell(); // ?
您正在通过调用cells[x][y]
来设置setPos
的某些成员,然后您将覆盖默认构造的cells[x][y]
对象的Cell
。我认为应该删除上面代码中的第二行。
您的单词
填充有效的向量(它是Cell的属性) 指南针的非空索引
因此i
索引应在for循环的每次迭代中都提高:
int i = 0;
for (Cell *c : compass) {
if (c != nullptr) {
notNull.push_back(i);
}
++i; // moved
}