Передача по ссылке не меняет переменную - PullRequest
0 голосов
/ 20 января 2012

Я пытаюсь реализовать функцию для изменения состояния меню, но моя ссылка теряется при выходе из функции:

void gotoLowerlevel(Menu *item)
{
    if (item->chld != 0x00) {
        item = item->chld;
    }
}

Вызов функции выполняется таким образом (currentState isуказатель на struct Menu):

case ENTER:
    if (cnsle->inMenuFlag == 0)
    {
        cnsle->inMenuFlag = 1;
        cnsle->currentState = cnsle->root;
        gotoLowerlevel(cnsle->currentState);
        displayMenu(cnsle->currentState,&cnsle->display);
    }

Я понятия не имею, почему это не работает.Есть идеи?

Ответы [ 2 ]

3 голосов
/ 20 января 2012

item в gotoLowerLevel - локальная переменная, даже если это ссылка на объект в другом месте.Чтобы изменить cnsle->currentState, вам необходимо:

  • передать cnsle
  • передать ссылку на cnsle->currentState (то есть изменить сигнатуру метода на Menu ** itemptr ипараметр вызова &cnsle->currentState)
  • или вернуть новое значение из gotoLowerLevel и присвоить его: cnsle->currentState = gotoLowerLevel(cnsle->currentState)

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

Другие объяснили, как передать ссылку.Код для моих предпочтительных решений:

Menu* gotoLowerlevel(Menu *item)
{
    if (item->chld != 0x00) {
        item = item->chld;
    }
    return item;
}

/* .... */
cnsle->currentState = gotoLowerlevel(cnsle->currentState);
2 голосов
/ 20 января 2012

Вы передаете указатель по значению.

Операции над объектом, на который он указывает, будут видны снаружи, но сам указатель является только копией.

Возможно, вы захотитеиспользовать указатель на указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...