- PR -

C# インデックスが配列の境界外です

投稿者投稿内容
AKIR
常連さん
会議室デビュー日: 2005/11/08
投稿数: 34
投稿日時: 2005-11-23 07:44
エラーが出る部分だけ取り出してコンソールでデバッグしてもエラーはでません。
エラーが出るのは毎回じゃなく、5回に1回ぐらいです。
コード:
public void Sortplayer()
		{
			for(int i = 0;i < 4;i++)
			{
				sortp[i] = player[ti[i]];
			}
		}


このforで囲んだ配列のラインがエラーですとなります。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-23 09:08
引用:

AKIRさんの書き込み (2005-11-23 07:44) より:

エラーが出る部分だけ取り出してコンソールでデバッグしてもエラーはでません。
エラーが出るのは毎回じゃなく、5回に1回ぐらいです。


例外が出た時の、
 sortp.Length, player.Length, ti.Length
の値を確認してみてください。

コード:

    public void Sortplayer() {
        try {
            for (int i = 0; i < 4; i++) {
                sortp[i] = player[ti[i]];
            }
        } catch (Exception ex) {
            MessageBox.Show("sortp.Length = " + sortp.Length.ToString());
            MessageBox.Show("player.Length = " + player.Length.ToString());
            MessageBox.Show("ti.Length = " + ti.Length.ToString());
            MessageBox.Show(ex.ToString());   // というか例外の詳細見ればわかりますよね
        }
    }


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-23 09:22
引用:

じゃんぬねっとさんの書き込み (2005-11-23 09:08) より:
引用:

AKIRさんの書き込み (2005-11-23 07:44) より:

エラーが出る部分だけ取り出してコンソールでデバッグしてもエラーはでません。
エラーが出るのは毎回じゃなく、5回に1回ぐらいです。


例外が出た時の、
 sortp.Length, player.Length, ti.Length
の値を確認してみてください。

コード:

    public void Sortplayer() {
        try {
            for (int i = 0; i < 4; i++) {
                sortp[i] = player[ti[i]];
            }
        } catch (Exception ex) {
            MessageBox.Show("sortp.Length = " + sortp.Length.ToString());
            MessageBox.Show("player.Length = " + player.Length.ToString());
            MessageBox.Show("ti.Length = " + ti.Length.ToString());
if (i < ti.Length) {
    MessageBox.Show("ti.Length = " + ti.Length.ToString());
    if (ti[i] < player.Length) {
        MessageBox.Show("ti[i] = " + ti[i].ToString());
    }
}
            MessageBox.Show(ex.ToString());   // というか例外の詳細見ればわかりますよね
        }
    }




これも欲しい
_________________
AKIR
常連さん
会議室デビュー日: 2005/11/08
投稿数: 34
投稿日時: 2005-11-23 16:02
ありがとうございました。エラーでなくなりました。例外を見ろとのことで、見てみたらOnPaintとありまして、よく考えてみたら、OnPaintの中でSortPlayer();とやっていたです。これはおかしい(かな?やっちゃだめ?)ですよね。コンストラクタで呼び出したら、エラーでなくなりました。

at musasi.Ranking.OnPaint(PaintEventArgs pea) in c:\vc#.net\musasi\musasi\ranking.cs:line 787
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs)
at System.Windows.Forms.Control.WmPaint(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
at System.Windows.Forms.ContainerControl.WndProc(Message& m)
at System.Windows.Forms.Form.WndProc(Message& m)
at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-11-23 16:38
引用:

AKIRさんの書き込み (2005-11-23 16:02) より:

ありがとうございました。エラーでなくなりました。例外を見ろとのことで、見てみたらOnPaintとありまして、よく考えてみたら、OnPaintの中でSortPlayer();とやっていたです。これはおかしい(かな?やっちゃだめ?)ですよね。コンストラクタで呼び出したら、エラーでなくなりました。


はい?
例外が出たときの、それぞれの値を確認しろ、ってことじゃないですか?

引用:

例外が出た時の、
 sortp.Length, player.Length, ti.Length
の値を確認してみてください。
MessageBox.Show("sortp.Length = " + sortp.Length.ToString());
MessageBox.Show("player.Length = " + player.Length.ToString());
MessageBox.Show("ti.Length = " + ti.Length.ToString());
if (i < ti.Length) {
MessageBox.Show("ti.Length = " + ti.Length.ToString());
if (ti[i] < player.Length) {
MessageBox.Show("ti[i] = " + ti[i].ToString());
}
}


この辺は無視ですか?


 OnPaint でソートするのがいいのか悪いのか、それは仕様やデータ構造も含めて考えないと、わかりません。
 問題は、「この例外はどういうときに発生するのか」ということを理解しないまま、たまたまよかった変更で先に進むことです。

 OutOfRange は、配列が10個宣言されているのに、11個目にアクセスしようとするなど、宣言した範囲を超えているときに発生します。ということは、何らかの条件で "i" や "ti[i]" が、配列 "sortp"、"player"、"ti" に宣言している個数を超えているわけです。
 なぜ超えるような状況が発生したのか、それを突き詰めて、どうでなければならないのか、考える必要があります。
___________________________________________________________________
□ written by Jitta on 2005/11/23
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________
AKIR
常連さん
会議室デビュー日: 2005/11/08
投稿数: 34
投稿日時: 2005-11-23 17:49
Jittaさんのソースiがforのスコープと違うんでコンパイルできませんでした。
じゃんぬねっとさんのソースでやりましたが、うまくいかないで、いつもと同じように例外がでるウィンドウがでてきました。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2005-11-23 18:08
例外処理と配列について本読んだほうがいいかも。

> Jittaさんのソースiがforのスコープと違うんでコンパイルできませんでした。

じゃぁiの宣言を最初でやったらよくないっすか?
AKIR
常連さん
会議室デビュー日: 2005/11/08
投稿数: 34
投稿日時: 2005-11-23 18:12
じゃんぬさんのソースでできました。全部4でした。

スキルアップ/キャリアアップ(JOB@IT)