views:

165

answers:

4

Hello:

I'm making a domino game and when the user adds a domino to the left, the domino is added but when the function exits the domino added is GONE.

FYI:

  • fitxesJoc (Link List) contains the dominoes of the game and is a pointer passed to the function (so that it lasts all the game)
  • opcionesCorrectas (Domino) contains the correct choices of domino

    • inferior (int) contains the smaller number of the domino
    • superior (int) contains the bigger number of the domino
    • pos (int) the position of the domino
  • opcionFitxa (int) contains the choice of the player

  • ultimaFitxa->seg is the 'next' node
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;

Header of the function

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

Call of the function

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

This way I add the domino, in the top of the other dominoes.

Thanks in Advance.

+4  A: 

Your problem is that the last line of demanar_fitxa_tirar:

fitxesJoc = ultimaFitxa;

is assigning to a local variable, which has no effect on the calling code. You need to pass a pointer to the calling code's fitxesJoc, like this:

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

void mainProgram()
{
    tNode* fitxesJoc;
    // ...
    resultado = demanar_fitxa_tirar(..., &fitxesJoc, ...);     // Note extra &
    // ...
}
RichieHindle
@ Richie, *shakes fist* ... Although your answer is superior so ... +1
Aiden Bell
@Aiden: A whole 37 seconds in it this time - you're slipping! 8-)
RichieHindle
@Richie: Off my game today. And my answer is shit :P *goes for coffee*
Aiden Bell
You are the best :D
+2  A: 

From your code, it's not clear where your function starts and ends and what it takes as parameters but I guess your problem is with the fitxesJoc variable which is probably passed as an argument to the function. C copies arguments when calling functions (call-by-value). You could pass the address to fitxesJoc variable using a pointer instead and rewrite it as something like this:

// 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;
Mehrdad Afshari
A: 

It looks like you're not actually adding the new domino to the linked list. But, it's hard to tell because you need to post more code, and because your code isn't in English.

rlbond
+1  A: 

I don't think you've provided enough code, but I suspect the problem is in:

fitxesJoc = ultimaFitxa;

(Linked-list now equals the new Node).

The problem is that parameters are passed by value. If you want to change the value of the parameter, you'll need to pass by pointer, and use the pointer to change the value.

*pfitxesJoc = ultimaFitxa;

Please provide more code, including the function header and the function call, for a better answer.

abelenky