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

时间:2018-09-20 18:02:40

标签: c++ arrays pointers nullptr

我在二维数组中以长度[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++;
        }
    }
}

1 个答案:

答案 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
  }