Сохранение переменной в Связанном списке
-
20-08-2019 - |
Вопрос
Я создаю игру в домино, и когда пользователь добавляет домино слева, домино добавляется, но при выходе из функции добавленное домино ИСЧЕЗАЕТ.
К ТВОЕМУ СВЕДЕНИЮ:
- 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 в связанный список.Но трудно сказать, потому что вам нужно опубликовать больше кода, а также потому, что ваш код написан не на английском.