-4

このコードが実行されないのはなぜですか?

for(int i=0;i<11;i++){
    for(int j=0;j<11;j++){  

        if(i>0){
            if((staticWallLoc[i--][j]&4)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|1;}
        }
        if(j<10){
            if((staticWallLoc[i][j++]&8)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|2;}
        }
        if(i<10){
            if((staticWallLoc[i++][j]&1)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|4;}
        }
        if(j>0){
            if((staticWallLoc[i][j--]&2)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|8;}
        }

        System.out.println(i+" "+j);
    }
}

ちなみに、staticWallLoc [11] [11]は、各次元(0-10)に11個のインデックスを持つ2次元配列です。

なぜ私のプログラムが文字通りこのコードを渡せないのか疑問に思っています。

4

7 に答える 7

2

おい-ループカウンターを制御するために使用しているのと同じ変数をループ本体でデクリメントするのはなぜですか?!?

「一歩前進、二歩後退」のようですね;)?

提案:

デバッガーを実行し、数回の反復を1ステップ実行して、「i」と「j」がどうなるかを注意深くメモします。

どちらかまたは両方が「11」に達するのはどれくらいになると思いますか;)?

于 2012-07-29T23:14:19.810 に答える
1

の内部if(i > 0)iは、によってデクリメントされstaticWallLoc[i--]ます。に変更しstaticWallLoc[i-1]、についても同じようにしjます。

if(i>0){
    // Try something like this instead
    if((staticWallLoc[i-1][j]&4)>0){
      staticWallLoc[i][j]=staticWallLoc[i][j]|1;
    }
}

また、に変更することもでき[i++]ます[i+1]

于 2012-07-29T23:17:08.843 に答える
0

ループには、のようなステートメントがありますif (i>0) {staticWallLoc[i--][j]...。これらはループインデックスを直接変更しています。したがって、がの場合i1に戻され0ます。ループがインクリメントされると、ループはに戻り10再び無限ループを作成します。

使用するつもりstaticWallLoc[i - 1][j]...ですか?これにより、ループインデックスを変更せずに目的のインデックスを取得できます。

于 2012-07-29T23:15:58.767 に答える
0

コードでi++i--などを使用するのではなく、オフセットi-1またはi+1を使用します。

一般的な経験則:forループでは、本体内のforループ変数をいじらないでください。

(ルールには例外がありますが、これは例外的なケースのようには見えません)

于 2012-07-29T23:16:00.010 に答える
0

配列の内容が一体何であるかを知らなければ、言うのは難しいです。--とでその場でiとjの値を変更しているためかもしれません++か?これらの値を一定に保ち、次のようなことを行うことを意味しますか?

if((staticWallLoc[i+1][j]&1)>0){staticWallLoc[i][j]=staticWallLoc[i][j]|4;} // changed i++ to i+1
于 2012-07-29T23:16:38.540 に答える
0

jが10に達すると、「if(j <10)」セクションではインクリメントされませんが、「if(j> 0)」セクションではデクリメントされるため、jはループを9で終了し、インクリメントされます。ループ管理によって10に戻ります。したがって、i = -1/0(ループ内でデクリメントおよびインクリメントされるため)およびj = 9/10(同じ理由で)の無限ループが発生します。

于 2012-07-29T23:17:20.517 に答える
0

j> = 10の場合、最後にj--を実行します。ループはj==10でスタックします。

ループ変数を操作するのはあまり良い考えではありません:)

于 2012-07-29T23:17:55.653 に答える