2

string[] 配列を反復処理し、いくつかのオブジェクトをリストに追加する関数を作成しています。セーブドゲームシステムのロードの一部です。テストする前にたくさんのコードを書いたので、まだたくさんのバグがあります。しかし、このデバッグ段階で、説明も修正もできない奇妙なバグを見つけました。
一部のデータにアクセスできません。元のコードがある場合、for ループの反復回数は必要な回数よりも 1 回少なくなります。イテレータ制限に +1 を追加すると、正常に動作します。結論として、-1 回または +1 回反復できますが、必要な回数ではありません。
これは元のコードで、反復回数が予想よりも 1 回少なくなります。

string str = " start at " + Convert.ToInt32(s[k]) + " " + k;
        for (int i = 0; i < Convert.ToInt32(s[k]); i++)
        {
            k++;
            landOwned.Add(setle.civil.land[Convert.ToInt32(s[k]), Convert.ToInt32(s[k+1])]);
            k++;
            str += "  iteration "+i + " finish " + k;
        }
        throw new ArgumentException(str);

これは、テキスト ファイルの行です。

f 4894 0 250 -523058 0 0 0 0 0 0 0 0 0 0 0 0 0 35 35 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3 4 2 4 3 3 4 4 1 0 1 0 1 0 1 2

キャッチされた例外のスクリーンショットは次のとおりです。

ここに画像の説明を入力

4

2 に答える 2

6

問題は、ループ終了テスト (k) で使用される変数がループ内でインクリメントされることです。

ループを次のように変更すると、問題が解決するはずです。

    var endIndex = Convert.ToInt32(s[k]);
    for (int i = 0; i < endIndex; i++)
于 2013-07-04T21:33:08.883 に答える
2

あなたのコメントへの答えとして、

forループを次のように扱うことができます

int i = 0;
while(i < something){
//...


i++
}

反復ごとに、while ループ内のチェックが再度チェックされ、Iまだ値より小さいかどうかが確認されます。これは、反復ごとに「何か」を整数に変換していることを意味します。@Compentient_techsソリューションは、これの初期値を別の変数に保存し、その後、チェックで確認する値を保存します

于 2013-07-05T08:26:25.287 に答える