dポイントプレゼントキャンペーン実施中!

二次元配列が確保(?)されてなくて困っています。
プログラム内で、以下のように宣言するのですが、

#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

A 回答 (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*の範囲外にあります??
    • good
    • 0

>二次元配列はウォッチすることができないのですか?



WATCHできますよ

mainが終了してからWATCHしていませんか?
★return EXIT_SUCCESS; でBREAKして見て下さいね(理由は分かりますよね?)

この回答への補足

>mainが終了してからWATCHしていませんか?

いえ、return EXIT_SUCCESS;の前に、
ブレークポイントをおいて、ウォッチしているのですが、
できませんでした。

他の原因は考えられないでしょうか?

補足日時:2005/04/14 19:06
    • good
    • 0

 メモリが確保されないのでしたら、


動的に配列のメモリを確保する必要があります。

 ただ、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);

もしくは、動的確保で調べてみてください。
はずしてたら、すいません。

この回答への補足

返信ありがとうございます。

なるほど。スタック領域の不足というのは考えませんでした。

ですが、以下のようなプログラムでも、
同様の現象(デバッグツールのウォッチで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;
}

補足日時:2005/04/14 10:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!