链表中的变量持久性

时间:2009-06-27 21:34:21

标签: c pointers linked-list

我正在进行多米诺骨牌游戏,当用户向左侧添加多米诺骨牌时,会添加多米诺骨牌,但是当功能退出时,添加的多米诺骨牌就是GONE。

供参考:

  • fitxesJoc(链接列表)包含多米诺骨牌 游戏并且是一个传递给该函数的指针(以便它持续所有游戏)
  • opcionesCorrectas(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);

这样我就把多米诺骨牌放在其他多米诺骨牌的顶部。

4 个答案:

答案 0 :(得分:4)

您的问题是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 &
    // ...
}

答案 1 :(得分:2)

从您的代码中,不清楚您的函数在哪里开始和结束以及它作为参数需要什么,但我猜测您的问题是fitxesJoc变量,它可能作为参数传递到功能。 C在调用函数时调用参数(call-by-value)。您可以使用指针将地址传递给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;

答案 2 :(得分:1)

我认为你没有提供足够的代码,但我怀疑问题在于:

fitxesJoc = ultimaFitxa;

(Linked-list现在等于新节点。)

问题是参数是按值传递的。 如果要更改参数的值,则需要通过指针传递, 并使用指针更改值。

*pfitxesJoc = ultimaFitxa;

请提供更多代码,包括函数标题和函数调用,以获得更好的答案。

答案 3 :(得分:0)

看起来你实际上并没有将新的多米诺骨牌添加到链表中。但是,很难分辨,因为你需要发布更多代码,因为你的代码不是英文代码。