• 締切済み

二次元配列について

二次元配列が確保(?)されてなくて困っています。 プログラム内で、以下のように宣言するのですが、 #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; }

関連するQ&A

  • VC++6.0での配列の動作不良

    現在、VC++6.0のWin32 Console Applicationプロジェクトでプログラムを書いているのですが、配列の様子がおかしいです。 具体的に言うと、ヘッダで #define N 10 #define NN (2*N*2*N) double A[NN+1][NN+1],S[NN+1][NN+1]; double B[NN+1],C[NN+1]; と配列を宣言しているのですが、A,B,Cそれぞれの配列への値の書き込みは普通に行えるのですが、 Sに値を書き込んでいる最中にプログラムが強制終了していまします。エラーメッセージなどはでません。 デバッグすると、Sに値を書き込むfor文の繰り返しの最後のほうに バンドルされていない例外は***.exeにあります。0xC0000005:Access Violation というメッセージが出てそこでプログラムが終了してしまいます。なぜでしょうか? AとSのfor文はまったく同じで、SかわりにAを使うと、このエラーは生じません。 またヘッダで、 #define N 10 #define NN 400 double A[NN+1][NN+1],S[NN+1][NN+1]; double B[NN+1],C[NN+1]; とNNを数字で表すとこのエラーが生じず、普通に実行されます。なぜこのようなことが起こるのでしょうか? どなたか教えていただければ幸いです。お願いします。

  • テキストファイルを二次元配列に

    お世話になります。 テキストファイルを1行ずつ読み込んで二次元配列に格納するプログラムですが、 //最大行数 #define LINE_MAX 10 //行内最大文字数 #define INPUT_MAX 128 char str[LINE_MAX][INPUT_MAX]; というようにして実現しています。 これを行数が分からないテキストファイルでも大丈夫なようメモリを動的に確保したいと考えています。 二つの次元の内、一つを動的に確保するにはどのようにしたら良いでしょうか。

  • 2次元配列をポインタで参照したいのですが・・

    下記Aのような2次元配列を作るとします。 A:1行あたり1024文字(ASCII)格納できるN行の2次元配列 Aの定義をまず下記Bのように行い、その後サイズ分メモリを確保しました。 B:char *str; この変数strを使って、x番目の行のy番目の文字を参照したい場合、どのようにすれば良いのでしょうか? 下記Cではやはりうまくいかないのでしょうか? C:str[x][y] 申し訳ございませんが、ご教授よろしくお願い致します。

  • java 多次元配列

    二次元平面を二次元配列int g[20][40]と対応させて考える。 g[x][y] == 1なら座標(x,y)に点があり、g[x][y] == 0なら点はないとする時、y = 2*x+5 (0=<x=<20)のグラフを表示するプログラムを作成せよ。 (xを縦方向,yを横方向と考えよ) というプログラムと同様にして y = x*x-8*x+16 (0=<x=<20)のグラフを表示するプログラムを作れ。という問題がプログラミング初心者の私には難しすぎます。 方法を教えて頂けないでしょうか?

  • java 多次元配列

    二次元平面を二次元配列int g[20][40]と対応させて考える。 g[x][y] == 1なら座標(x,y)に点があり、g[x][y] == 0なら点はないとする時、y = 2*x+5 (0=<x=<20)のグラフを表示するプログラムを作成せよ。 (xを縦方向,yを横方向と考えよ。) というプログラムと同様にして y = x*x-8*x+16 (0=<x=<20)のグラフを表示するプログラムを作れ。という問題がプログラミング初心者の私には難しすぎます。 方法を教えて頂けないでしょうか?

  • 2次元配列の動的確保&配列の添え字の書式について

    (1)2次元配列の動的確保について 1次元配列の動的確保は理解できたのですが、次のプログラムの 文(ⅰ)~(ⅱ)の意味を理解できていないので教えてください。 int **a, j, k, nrows=3, ncolumns=4 ; a = (int **)malloc(nrows * sizeof(int *)); a[0] = (int *)malloc(nrows * ncolumns * sizeof(int)); …(ⅰ) //先頭アドレスに… for(j = 1; j < nrows; j++) a[j] = a[0] + j * ncolumns; …(ⅱ)   //この行が特にわかりません。 (2)配列の添え字について この書き方はどういう意味になりますか? out[X_SIZE * (i) + (j)] 分かる方、回答お願いします。

  • 2次元配列の配列

    VisualBasic.NETでプログラムを作っているのですが、2次元配列の配列で行き詰って困っています。 配列1~3を別に定義して、その2次元配列を配列Xという配列にひとまとめにしたいのですが、エラーが出てしまいます。 エラー内容は「配列初期化子の次元が少なすぎます」で、場所は配列Xの第1要素です。 配列1~3以降もどんどん配列を追加していく予定なので、なるべく以下の方法で書いていきたいのですが、解決法はないでしょうか? また、他にいい方法があればご教授ください。 ソースです。 ---------------------------------------- Public 配列1(,) As Integer = _ { _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1}, _ {1, 1, 1} _ } Public 配列2(,) As Integer = _ { _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2}, _ {2, 2, 2} _ } Public 配列3(,) As Integer = _ { _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3}, _ {3, 3, 3} _ } Public 配列X(,)() As Integer = { _ 配列1, _     ←ここにエラーが出る 配列2, _ 配列3 _ } ---------------------------------------- 回答よろしくお願いします。

  • 配列のとれる領域

    #include<stdio.h> #define X_wid 512 #define Y_wid 512 main(int argc,char *argv[]) { int x=0,y=0,X=0,Y=0,c; int input[X_wid+1][Y_wid+1],middle[X_wid][Y_wid]; FILE *fp,*fp_w;  :  : } middle[X_wid][Y_wid]配列のとる領域の値を大きくとるとエラーメッセージがでてしまいます。 [1][1]や[X_wid][Y_wid]などは正常にコンパイルできるのですが、[X_wid*2][Y_wid*2]みたいに領域を多くするとエラーメッセージがでてしまいます。 やはり、配列のとれる領域は制限があるのでしょうか? また、それでもその領域([X_wid*2][Y_wid*2)を使わなければならない時はどうすればよいでしょうか?

  • 多次元配列の行列

    1番 キーボードから3×3の行列の要素を2次元配列に入力した後、その値を表示するプログラムをさくせいせよ 2番 キーボードから3×4の行列の要素を2次元配列に入力した後、転置行列を出力するプログラムをさくせいせよ 3番 2つの行列A(3×3行列)、B(3×3行列)の買う要素の値をキーボードから2つの配列に入力し、2つの行列、並びに、それらの和、差、積の行列を出力するプログラムを作成せよ(Bに単位行列を入れて検算せよ) 4番 2行3列の行列と3行2列の積を求めるプログラムを作成せよ どなたかわからないでしょうか?? 数が多くてすみません。 わかる方お願いします!!

  • C言語 配列の確保

    はじめまして。C言語の勉強を最近始めたのですが、 以下のプログラムで教えていただきたい点があります。 #include <stdio.h> #include <math.h> #define x 10000 #define y 200000 #define z 1.0E-12 #define k 1.38 #define kE 1.0E-23 #define h 6.63 #define hE 1.0E-34 #define c 3.00 #define cE 1.0E+08 void main(void){ int i; double A[x+1]; double B[x+1]; for(i=0;i<=x;i++) { A[i]=(i+y)*z; B[i] = exp(-(h*hE*c*cE)/(A[i]*k*kE*1000)); printf("%e %e\n",A[i],B[i]); }} このプログラムで、xを100000にするとプログラムが動かなくなってしまいます。OSはWindowsXP、ソフトはVisual C++ 6.0を使っています。 解決方法を教えていただけないでしょうか。

専門家に質問してみよう