Массив указателей остается нулевым, несмотря на то, что он установлен напрямую - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть список объектов 'cell' в двумерном массиве длины [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 голосов
/ 20 сентября 2018

Измените

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
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...