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

インデックスが配列の境界外です。と表示されます。

環境/言語:[Window 7 Microsoft Visual C# 2010 Express]
分類:[.NET]

はじめまして。

n×Nsの配列を生成し、各配列にランダムな数を代入していくというプログラムを作っています。
以下のソースコードをビルドするとエラーはないのですが、実行するとタイトルのような例外が発生します。
ご教授していただけたら幸いと思い質問させていただきます。
よろしくお願いします。

using System;

class useVars
{
static void Main()
{
int N = 5; //試行回数
int c = 40; //チャネルの数
int Ntm; //端末数
int Ns; //端末数の範囲
int n; //i, j, k, l;
int seed = Environment.TickCount;

for (n = 1; n < N; ++n)
{
for (Ntm = 10; Ntm <= 40; Ntm = Ntm + 10)
{
Random rnd = new Random(seed++);

for (Ns = 1; Ns <= Ntm; ++Ns)
{
int[,] table = new int[n, Ns];
table[n, Ns] = rnd.Next(1, c + 1);
Console.Write(table[n, Ns] + " ");
}
Console.WriteLine();
}
}
}
}
■No31098に返信(おひでさんの記事)
> はじめまして。
>
> n×Nsの配列を生成し、各配列にランダムな数を代入していくというプログラムを作っています。
> 以下のソースコードをビルドするとエラーはないのですが、実行するとタイトルのような例外が発生します。
> ご教授していただけたら幸いと思い質問させていただきます。
> よろしくお願いします。
>
> using System;
>
> class useVars
> {
> static void Main()
> {
> int N = 5; //試行回数
> int c = 40; //チャネルの数
> int Ntm; //端末数
> int Ns; //端末数の範囲
> int n; //i, j, k, l;
> int seed = Environment.TickCount;
>
> for (n = 1; n < N; ++n)
> {
> for (Ntm = 10; Ntm <= 40; Ntm = Ntm + 10)
> {
> Random rnd = new Random(seed++);
>
> for (Ns = 1; Ns <= Ntm; ++Ns)
> {
> int[,] table = new int[n, Ns];
> table[n, Ns] = rnd.Next(1, c + 1);
> Console.Write(table[n, Ns] + " ");
> }
> Console.WriteLine();
> }
> }
> }
> }
自分が書いているコードが何をするコードなのか順にきちんと読み直してみましょう。


1.配列の要素数とインデックス
int[] a = new int[5]; // 5個の要素を確保したのでインデックスとしては 0 から 4まで。

a[0] = 0; // OK
a[4] = 4; // OK
a[5] = 5; // ArgumentOutOfRangeException
a[-1] = -1; // ArgumentOutOfRangeException


2.配列は基本的に後から要素数を増やせない。
要素数を増やしたくなったら配列を確保し直して、これまでに入れていた要素をコピーする必要がある。
最初から数が決まっているならその数で最初に確保し、動的に数が増えるなら、List<T> を使うべし。


3.変数のスコープ(生存期間)を見直す
今の table は一番内側の for ループの間だけ有効なので、for ループを抜けると作った配列は使うことができません。
前コメが書いた内容が反映されておらず、編集もできないので
再度書きます。

> int[,] table = new int[n, Ns];
> table[n, Ns] = rnd.Next(1, c + 1);

1.この処理をforループ内で行っているため配列の生成が毎回やりなおされ意味がない。forの外で配列を確保するようにしないといけないと思います。
2.この1行めでn × Nsのサイズの配列を取得しているが2行目でn,Nsという配列の範囲外へ値を設定しているため当該エラーが発生しています。
Azuleanさん、回答ありがとうございました.
1.の説明、とてもわかり易かったです.
指摘していただいた部分を注意して,List<T>を使い,プログラムを書いたところ実行することが出来ました.

ありがとうございました.

■No31102に返信(Azuleanさんの記事)
> 自分が書いているコードが何をするコードなのか順にきちんと読み直してみましょう。
>
>
> 1.配列の要素数とインデックス
> int[] a = new int[5]; // 5個の要素を確保したのでインデックスとしては 0 から 4まで。
>
> a[0] = 0; // OK
> a[4] = 4; // OK
> a[5] = 5; // ArgumentOutOfRangeException
> a[-1] = -1; // ArgumentOutOfRangeException
>
>
> 2.配列は基本的に後から要素数を増やせない。
> 要素数を増やしたくなったら配列を確保し直して、これまでに入れていた要素をコピーする必要がある。
> 最初から数が決まっているならその数で最初に確保し、動的に数が増えるなら、List<T> を使うべし。
>
>
> 3.変数のスコープ(生存期間)を見直す
> 今の table は一番内側の for ループの間だけ有効なので、for ループを抜けると作った配列は使うことができません。
shuさん,回答ありがとうございました.
おかげで,配列をちゃんと用意することが出来ました.
そして,tableをforループの外に確保した結果,希望の値を得ることが出来ました.

ありがとうございました.

■No31103に返信(shuさんの記事)
> 前コメが書いた内容が反映されておらず、編集もできないので
> 再度書きます。
>
>>int[,] table = new int[n, Ns];
>>table[n, Ns] = rnd.Next(1, c + 1);
>
> 1.この処理をforループ内で行っているため配列の生成が毎回やりなおされ意味がない。forの外で配列を確保するようにしないといけないと思います。
> 2.この1行めでn × Nsのサイズの配列を取得しているが2行目でn,Nsという配列の範囲外へ値を設定しているため当該エラーが発生しています。

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