DOBON.NETプログラミング道掲示板

■34526 / 親記事)  二次元配列 インデックスが配列の境界外
  
□投稿者/ タサケン 一般人(1回)-(2020/09/02(Wed) 23:17:44)
  • アイコン環境/言語:[環境:Windows 10 64bit 使用言語:C# .NET Frameworkのバージョン:4.7.2] 
    分類:[.NET] 

    以下のようにプログラムしてデバッグしたら
    インデックスが配列の境界外です
    と出てしまいますどうすればいいか教えてください

          int[,] array = new int[5, 5];

    int y = array.GetLength(0);
    int timesx = 1;
    int counter = 0;
    int counter2 = 0;
    int number2 = 0;
    if(array.GetLength(1)%2==0)
    {
    number2 = 1;
    }

    for (int number = 1; number <= array.Length; number++)
    {
    for (int x = array.GetLength(1) - 1; x >= number2; x--)
    {
    counter++;

    if (counter % 2 == 1)
    {
    timesx = y * 2 - 1;
    }
    if (x == 0)
    {
    timesx = y - 1;
    }
    while (timesx > 0)
    {
    if (counter % 2 == 0)
    {
    x = -x;
    y = -(y - 1);
    }
    else
    {
    counter2++;
    if (counter2 % 2 == 1)
    {
    y = 0;
    }
    else
    {
    x = -x;
    y = 1;
    }
    if (x == 0)
    {
    y = 1;
    }
    }
    array[x, y] = number;
    if (x < 0)
    {
    x = -x;
    }
    y = array.GetLength(0);
    timesx--;
    }
    counter2 = 0;
    timesx = 1;

    }
    }
マルチポストを報告
違反を報告
引用返信 削除キー/
■34527 / ResNo.1)  Re[1]: 二次元配列 インデックスが配列の境界外
□投稿者/ Hongliang 大御所(585回)-(2020/09/03(Thu) 08:59:04)
  • アイコン
    例えばこの部分
    array[x, y] = number;
    if (x < 0)
    {
        x = -x;
    }
    配列の添え字が負になることはないのですから、
    xを添え字に使った後で負かどうか判定するというのは
    ロジックとしておかしいですね。
    
    まあ何がどうなるのが正解かを知らないので、
    「どうすればいいか」は私には答えられませんが。

違反を報告
引用返信 削除キー/
■34528 / ResNo.2)  Re[1]: 二次元配列 インデックスが配列の境界外
□投稿者/ 魔界の仮面弁士 大御所(1293回)-(2020/09/03(Thu) 08:59:35)
  • アイコンNo34526に返信(タサケンさんの記事)
    > int[,] array = new int[5, 5];
    上記により、5×5 すなわち 25要素の配列が確保されますね。
    それぞれの添字は 0〜4 の範囲となります。

     [0,0], [1,0], [2,0], [3,0], [4,0],
     [0,1], [1,1], [2,1], [3,1], [4,1],
     [0,2], [1,2], [2,2], [3,2], [4,2],
     [0,3], [1,3], [2,3], [3,3], [4,3],
     [0,4], [1,4], [2,4], [3,4], [4,4]


    > インデックスが配列の境界外です
    > と出てしまいます

    array 配列に渡している添字が
    「0≦x≦4」かつ「0≦y≦4」になっていないからです。


    > array[x, y] = number;
    に至るまでの処理を良く見直してみてください。

    最初にこの行に来た段階では、
     「x = 4」「y = 0」、「number = 0」
    となるので、問題無く代入できます。

    しかし 2 回目にここに来た時には、
     「x = -1」「y = 1」、「number = 1」
    となっているわけですから、array[x, y] へのアクセスが
    IndexOutRangeException を誘発するのは当然のことです。


    > どうすればいいか教えてください

    コードを修正してください。

    エラーが出ないようするだけなら、添字が範囲外の時には
    配列を読み書きしないようにすればエラーは出なくなります。

    しかしそれが期待する動作であるかは別問題です。
    そもそも x や y が範囲外になってしまうことが問題というのであれば、
    そこに至るまでの処理を見直す必要があるでしょう。


    いずれにせよ、x や y の取るべき範囲は 0〜4 に限られますが、
    まずはループ範囲の確認からですね。


    > for (int number = 1; number <= array.Length; number++)
    の処理は、number が 1〜25 という範囲を紡ぐことを意味します。

    > for (int x = array.GetLength(1) - 1; x >= number2; x--)
    number2 は 0 か 1 のいずれかになる想定であり、
    今回の場合は number2 が 0 と割り当てられています。
    そのため上記ループは、x が 4〜0 という範囲をとることになります。


    問題は、その x ループ内で、
    何度か「x = -x;」という表現が登場していることです。


    x が取りうる範囲は 0〜4 なのですから、正負符号を反転させることに
    合理性があるとは思えません。

    ましてや、変数 x は for のループカウンターにもなっているわけですから、
    ループ途中でカウンタの値を変更してしまうと、ループ回数の判定が
    分かりにくくなります。


    そもそもこの一連の処理で、何をさせたいのでしょうか?
    一連のコードで何を行おうとしているのか、
    処理の「意図」あるいは「目的」を知っているのは
    コードを組んだ御本人だけです。

    あるいはコードの各処理の意味を説明して頂ければ、
    第三者でも問題点を指摘できるかもしれません。
違反を報告
引用返信 削除キー/



スレッド内ページ移動 / << 0 >>

このスレッドに書きこむ

Mode/  Pass/


- Child Tree -