0

私はドミノゲームを作っています。ユーザーが左側にドミノを追加すると、ドミノが追加されますが、関数が終了すると、追加されたドミノはなくなります。

ご参考までに:

  • fitxesJoc(リンクリスト)にはゲームのドミノが含まれており、関数に渡されるポインターです(すべてのゲームが続くように)
  • opcionesCorrectas(ドミノ)には、ドミノの正しい選択肢が含まれています

    • 下位(int)には、少数のドミノが含まれています
    • スーペリア(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

4 に答える 4

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 &
    // ...
}
于 2009-06-27T21:38:07.670 に答える
2

コードからは、関数の開始位置と終了位置、およびパラメーターとして何を受け取るかは明確ではありませんが、問題はおそらく関数の引数として渡される変数にあると思います。fitxesJocCは、関数を呼び出すときに引数をコピーします(値による呼び出し)。代わりにポインタを使用してアドレスを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;
于 2009-06-27T21:39:29.650 に答える
1

十分なコードを提供したとは思いませんが、問題は次の場所にあると思われます。

fitxesJoc = ultimaFitxa;

(リンクされたリストは新しいノードと同じになります)。

問題は、パラメーターが値で渡されることです。パラメーターの値を変更する場合は、ポインターで渡し、ポインターを使用して値を変更する必要があります。

*pfitxesJoc = ultimaFitxa;

より良い回答を得るために、関数ヘッダーと関数呼び出しを含むより多くのコードを提供してください。

于 2009-06-27T21:40:40.147 に答える
0

リンクされたリストに新しいドミノを実際に追加していないようです。ただし、コードをさらに投稿する必要があり、コードが英語ではないため、わかりにくいです。

于 2009-06-27T21:40:24.127 に答える