Вопрос

Я создаю игру в домино, и когда пользователь добавляет домино слева, домино добавляется, но при выходе из функции добавленное домино ИСЧЕЗАЕТ.

К ТВОЕМУ СВЕДЕНИЮ:

  • fitxesJoc (Список ссылок) содержит костяшки домино из игры и является указателем, переданным функции (чтобы она сохранялась всю игру).
  • opcionesCorrectas (Domino) содержит правильные варианты domino

    • inferior (int) содержит меньшее число домино
    • superior (int) содержит большее число домино
    • pos (int) положение доминошки
  • opcionFitxa (int) содержит выбор игрока

  • ultimaFitxa-> seg - это "следующий" узел
tNode* ultimaFitxa = (tNode *)malloc(sizeof(tNode));
ultimaFitxa->info.inferior = opcionesCorrectas[opcionFitxa - 1].inferior;
ultimaFitxa->info.superior = opcionesCorrectas[opcionFitxa - 1].superior;
ultimaFitxa->info.pos = opcionesCorrectas[opcionFitxa - 1].pos;
ultimaFitxa->seg = fitxesJoc;
fitxesJoc = ultimaFitxa;

Заголовок функции

unsigned int demanar_fitxa_tirar(tJugador *jugador, tNode* fitxesJoc, tPartida *partida, tPila* fitxesBarrejades, bool primerCop)

Вызов функции

resultado = demanar_fitxa_tirar(&Jugadors[jugadorActual], fitxesJoc, partida, fitxesBarrejades, true);

Таким образом, я добавляю доминошку поверх других костяшек домино.

Это было полезно?

Решение

Ваша проблема в том, что последняя строка demanar_fitxa_tirar:

fitxesJoc = ultimaFitxa;

присваивается локальной переменной, которая никак не влияет на вызывающий код.Вам нужно передать указатель на вызывающий код fitxesJoc, вот так:

unsigned int demanar_fitxa_tirar(..., tNode** fitxesJoc, ...)  // Note extra *
{
    // ...
    *fitxesJoc = ultimaFitxa;                                  // Note extra *
}

void mainProgram()
{
    tNode* fitxesJoc;
    // ...
    resultado = demanar_fitxa_tirar(..., &fitxesJoc, ...);     // Note extra &
    // ...
}

Другие советы

Из вашего кода неясно, где начинается и заканчивается ваша функция и что она принимает в качестве параметров, но я догадываюсь ваша проблема связана с fitxesJoc переменная, которая, вероятно, передается в качестве аргумента функции.C копирует аргументы при вызове функций (вызов по значению).Вы могли бы передать адрес по fitxesJoc переменную, использующую вместо нее указатель, и перепишите ее как что-то вроде этого:

// fitxesJoc would be a `tNode**` rather than `tNode*`.
tNode* ultimaFitxa = (tNode *)malloc(sizeof(tNode));
ultimaFitxa->info.inferior = opcionesCorrectas[opcionFitxa - 1].inferior;
ultimaFitxa->info.superior = opcionesCorrectas[opcionFitxa - 1].superior;
ultimaFitxa->info.pos = opcionesCorrectas[opcionFitxa - 1].pos;
ultimaFitxa->seg = *fitxesJoc;
*fitxesJoc = ultimaFitxa;

Я не думаю, что вы предоставили достаточно кода, но я подозреваю, что проблема заключается в:

fitxesJoc = ultimaFitxa;

(Связанный список теперь равен новому узлу).

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

*pfitxesJoc = ultimaFitxa;

Пожалуйста, предоставьте больше кода, включая заголовок функции и вызов функции, для лучшего ответа.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top