2

私は部屋を作る工場を作っています、そしてそれはステップのintとスタートルームを通過し、そしてそれはステップを実行し、部屋を作り、そしてそれから一歩少ないステップでそれ自身を呼び、そして新しい部屋をスタートルームとして呼ぶことになっています。問題はそれが決して終わらないということです。デバッガーでは、それ自体が呼び出していることがわかります。これにより、実際にはステップが1つ少ない別のメソッド呼び出しがメモリ内に作成されますが、実行行は現在のメソッド呼び出しの先頭に移動します。したがって、実際に新しい呼び出しが完了することはありません。新しい呼び出しをスタックではなくヒープに入れて、実際に到達することはないかのように。

コード:

@Override
public Room place(Level level, int cycles, Room start_room,
        Direction direction, int shop, int exit, LevelFactoryReport report) throws Exception
{


    Room room = null;
    if(cycles < 1)
    {
        return start_room;
    }
    else
    {
        report.addEvent("--Placer step--");
        report.addEvent("Steps remaining: "+cycles);
        room = this.Step(level, start_room, direction, shop, exit, report);
        if(room == null)
        {
            cycles = 0;
            report.addEvent("Step returned a null room (probably because it ran into an existing room). Ending cycle.");
        }
    }
    return place(level, (cycles--), room, direction, (shop--), (exit--), report);
}

上記のコードでは、さまざまな実装を経て、place()の新しい呼び出しに到達し、place()の新しいインスタンスを作成するだけですが、それにステップインせず、代わりに実行行が移動します元の呼び出しの「Roomroom=start_room」に戻ります。これは無限に行われ、サイクルは常に初期値の4であり、place()のインスタンスがスタックを埋め尽くします。新しいインスタンスを調べましたが、実際にはすべてのインスタンスの「サイクル」値は3です。

奇妙なことに、実際に実行される各反復は次の部屋で実行されているため、トップに戻ると、次の部屋を通過してトップに戻ります。しかし、なぜそれはplace()の新しいインスタンスを作成し(新しい部屋と新しいサイクル値3で)、新しい部屋を使用して古いplace()を再実行しますが、新しいサイクル値3ではないのですか?

4

2 に答える 2

6

を使用してcycles--shop--変数をデクリメントします。ただし、x--xをデクリメントしますが、デクリメントされた値は返しません。式の戻り値x--は、の古い値ですxx-1の代わりに使用してくださいx--。(または--x、必要な場合でも、ここで変数を変更しても意味がありません)。

于 2010-07-11T21:21:55.193 に答える
1

この行を置き換えてみてください:

return place(level, (cycles--), room, direction, (shop--), (exit--), report);

この行で:

return place(level, (--cycles), room, direction, (--shop), (--exit), report);

たぶんあなたはここでいくつかのより多くの助けを見つけることができます

于 2010-07-11T21:24:29.083 に答える