Замена массивов указателей без прямого доступа к массиву - PullRequest
0 голосов
/ 25 апреля 2018

Попытка заставить моего персонажа двигаться в матрице с помощью команд. Но я не могу понять движение совершенно правильно.

Вот код, загруженный в WandBox для экономии места: WandBox

Ожидаемое: Я ожидаю, что когда я нажму клавишу w, точка на карте '*' поднимется вверх. поменяв местами два указателя.

Результат: Обмен ничего не делает, даже если указатели меняются.

void Player::update(Node * neighbors[8], const char c,Node * self)
{
    switch (c)
    {
    case 'w':
        move(neighbors[1],self);
        break;
    default:
        break;
    }
}

//This is right issent it?
void Player::move(Node * newspot, Node * oldspot)
{
    Node* temp = newspot;
    newspot = this;
    oldspot = this->standingTile;
    this->standingTile = temp;
}

Я не понимаю. Я попробовал несколько разных вещей, например указатель на указатель массива, так что, надеюсь, мой пример не выглядит сумасшедшим.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Думаю, я понял это. Оказывается, то, что я пытаюсь сделать, называется "множественным косвенным воздействием".

как заметил @Peter, было нетривиально просто поменять указатели таким образом.

virtual Node* update(Node** neighbors[8], char& c);

Это было то, что мне было нужно, когда я передаю массив указателей указателям в сохраненном массиве, чтобы я мог поменять их местами на верхнем уровне.

int* myArrayOfInts[MAP_SIZE*MAP_SIZE];

Где я могу хранить точный список всех объектов.

Тогда, когда мне нужно манипулировать им как двумерным массивом:

int*(*map)[MAP_SIZE] = (int*(*)[MAP_SIZE])myArrayOfInts; //Cast as 2d Array temporarily.

Теперь я могу рассматривать карту как обычный двумерный массив указателей.

Теперь становится проще настроить родительский массив, передав указатель на массив указателей как:

&map[x][y]

Или, в моем случае, Хранение их в массиве указателей на указатели массива ....

Node** neighbors[8];
neighbors[0] = &map[x][y];

Затем я могу передать это функции, что позволит мне менять значения без копирования и перемещения целых объектов.

Йо, собака, я собираю тебе указатели лейк, поэтому мы ставим указатели на твои указатели в массивах указателей указателей .....

0 голосов
/ 25 апреля 2018

Попробуйте вместо этого:

void Player::update(Node * neighbors[8], const char c,Node * self)
{
    switch (c)
    {
    case 'w':
        move(&neighbors[1],&self);
        break;
    default:
        break;
    }
}

void Player::move(Node ** newspot, Node ** oldspot)
{
    Node* temp = *newspot;
    *newspot = this;
    *oldspot = this->standingTile;
    this->standingTile = temp;
}
...