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

■34528 / 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 のループカウンターにもなっているわけですから、
    ループ途中でカウンタの値を変更してしまうと、ループ回数の判定が
    分かりにくくなります。


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

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

前の記事(元になった記事) 次の記事(この記事の返信)
←二次元配列 インデックスが配列の境界外 /タサケン 返信無し
 
上記関連ツリー

Nomalアイコン 二次元配列 インデックスが配列の境界外 / タサケン (20/09/02(Wed) 23:17) #34526
Nomalアイコン 二次元配列 インデックスが配列の境界外 / 魔界の仮面弁士 (20/09/03(Thu) 08:59) #34528 ←Now
Nomalアイコン Re[1]: 二次元配列 インデックスが配列の境界外 / Hongliang (20/09/03(Thu) 08:59) #34527

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -