• 締切済み

二次元配列について

二次元配列が確保(?)されてなくて困っています。 プログラム内で、以下のように宣言するのですが、 #define MM 1025 //プログラム6行目 #define NN 10 //7行目 double y[MM][NN]; //17行目 y[0][0] = 3.0; //28行目 Visual Studio.NET のデバッグツールの「ウォッチ」で、 y[0][0]に代入された値を確認しようとすると、 エラー:インデックス'0'は、ポインタ/配列'y'の範囲外にあります と、表示され、中身を確認することができません。 それどころか、プログラムの後半98行目を境に、 y[0][0]の値が上書きされてしまいます。 x[k] = x[0] + k*h; //98行目 ここから、察するにメモリがちゃんと確保されていないと、 思うのですが、どうすればいいかわからず、困っています。 どなたかご教授をお願いいたします。 環境 OS : Windows XP 開発環境 : Visual Studio.NET

みんなの回答

  • shin_say
  • ベストアンサー率100% (2/2)
回答No.3

うーん、私の環境じゃ再現性がないッス(Win2k, VS.net2003)。普通にウォッチできます。 int main(void) { int a[3][2]; a[1][1] = 5; return EXIT_SUCCESS;//ここにBP } ウォッチ式はa[1][1]です。当然5と表示されます。 先の回答者に示されたStack over flowの可能性ですが、そもそもデバッグモードでStack over flowが起きら「スタック足らんよ」と言って落っこちるので、ありえないです。 再現性が無いので、私はこれ以上明確な回答を出せないのですが、とりあえず藁にすがる思いでサービスパックを当ててみてください… > 同様の現象(デバッグツールのウォッチでa[1][1]を確認しようとすると、 > エラー:インデックス'1'は、ポインタ/配列'y'の範囲外にあります > と、表示される)が、起きます。 a[1][1]をウォッチしてるのに*y*の範囲外にあります??

  • nagare
  • ベストアンサー率33% (280/831)
回答No.2

>二次元配列はウォッチすることができないのですか? WATCHできますよ mainが終了してからWATCHしていませんか? ★return EXIT_SUCCESS; でBREAKして見て下さいね(理由は分かりますよね?)

atushi_01
質問者

補足

>mainが終了してからWATCHしていませんか? いえ、return EXIT_SUCCESS;の前に、 ブレークポイントをおいて、ウォッチしているのですが、 できませんでした。 他の原因は考えられないでしょうか?

  • Rulururu
  • ベストアンサー率18% (6/33)
回答No.1

 メモリが確保されないのでしたら、 動的に配列のメモリを確保する必要があります。  ただ、1025*10位の2次元配列でしたら、 クラスのメンバ変数、もしくは グローバル変数として宣言されていれば、 静的配列でも大丈夫な気もします。 (XPが動作するほどのマシンでしたら) double y[MM][NN]; //17行目 は、メンバ又はグローバル変数として ヘッダのクラスの中もしくは、関数の外で 宣言されているでしょうか。 ローカル変数だとメモリ(スタック)が足りない 思います。 いちおう、2次元配列の動的確保の例を 書いてみましたので、もし参考になれば double **a; a = (double**)malloc(sizeof(double)*1025); for (int i=0;i<1025;i++) { a[i] = (double*)malloc(sizeof(double)*10); } a[0][0] = 929.221; CWnd *List = GetDlgItem(IDC_LIST1); CString str; str.Format("sum is %f", a[0][0]); ((CListBox *)List)->AddString(str); for (int i=0;i<1025;i++)//ここから解放処理 { free(a[i]); } free(a); もしくは、動的確保で調べてみてください。 はずしてたら、すいません。

atushi_01
質問者

補足

返信ありがとうございます。 なるほど。スタック領域の不足というのは考えませんでした。 ですが、以下のようなプログラムでも、 同様の現象(デバッグツールのウォッチでa[1][1]を確認しようとすると、 エラー:インデックス'1'は、ポインタ/配列'y'の範囲外にあります と、表示される)が、起きます。 int a[3][2]は、さすがにスタック領域でも確保されると思うのですが、 どうでしょうか? それとも、確保はされているけれど、 二次元配列はウォッチすることができないのですか? よろしくお願いします。 #include<iostream> #include<fstream> using namespace std; int main(void) { int a[3][2]; a[1][1] = 5; return EXIT_SUCCESS; }