
C++で3次元配列を使用したいのですが,強制終了させられてしまいます.
おそらくスタックオーバーフローというものが起こっているようなのですが,
double L[10][500][30],a[10][500][30],b[10][500][30],…
というふうに,
10*500*30の要素数の配列を全部で10種類使用するのはやはりメモリ的に無理があるのでしょうか?
コード作成はVisual Studio 2008,コンパイラはgccで実行しています.
あまりこの要素数は減らしたくないのですが,
何か解決策があれば教えてください.
------------------------------------------------------------
環境:WinXP, メモリ1GB, Pentium4
ちなみに,いくつか対策を講じて見ましたが,エラーが出てしまった例を一応下に載せておきます.
<VisualStudioでデバッグ有りのコンパイル>
エラー."System.StackOverflowException' のハンドルされていない例外が発生しました"
<new()を使用した配列の動的確保>
double ***L, ***a, ・・・;
L = new double**[30];// double型30個分の領域を動的確保
a = new double**[30];
…
for(k=0; k<=30; k++){
L[k] = new double*[500];// double型500個分の領域を動的確保
a[k] = new double*[500];
・・・}
for(k=0; k<=30; k++){
for(j=0;j<=500; j++){
☆L[j][k] = new double[10];// double型10個分の領域を動的確保
a[j][k] = new double[10];
・・・}}
☆:エラー発生."保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。"
No.2ベストアンサー
- 回答日時:
ローカル変数はスタックに格納されます。
スタック上に1MB越えをする配列を10個とる事など大体のOSの実装では想定されていません。グローバル変数か、newかmallocでの確保が必要です。
でnewでの確保の失敗ですが、
☆L[j][k] = new double[10];// double型10個分の領域を動的確保
a[j][k] = new double[10];
添え字のjとkが逆ですよ。
今のプログラムだとL[30][500][10]の配列としてアクセスする必要があります。元のdouble L[10][500][30]と逆になっているのでプログラムを直したほうが良いですよ。
ありがとうございます!
添え字が逆との指摘,修正したら確保できました。
お礼が遅くなってしまいましたが,
ありがとうございました!
No.3
- 回答日時:
>System.StackOverflowException
スタックサイズはコンパイラによって設定可能です。
GCCやVCではデフォルト1MBとされていますが、
環境によっては変更できないので、お勧めできません。
> L[j][k] = new double[10];//
既に出てますが、ここで普通に
アクセス違反していますね。
正しくはL[k][j]。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語 関数プロトタイプ宣言の...
-
doubleの変数にintとintの割り...
-
int とdoubleの比較
-
if((double)a >= (double)b))
-
浮動小数点の誤差のあわせ方
-
【C言語】二階微分方程式をル...
-
「割り算」 と 「分数の掛け算」
-
浮動小数点の定数
-
C言語を実行すると-infが出てき...
-
-1.#IND00と出てしまうのですが...
-
fgets()による繰り返し入力(c言語)
-
doubleは常に%lfとするべきなのか
-
(C,C++言語)関数の引数は自動キ...
-
C++で外積
-
プロトタイプ宣言の説明
-
difftime()について
-
最早開始時間と最遅完了時刻を...
-
信頼区間の1.96や1.65ってどこ...
-
Aの値からBの値を除するとは??
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
c言語で、繰り返し文の中で、0....
-
doubleの変数にintとintの割り...
-
至急です! マクロ定義で #defi...
-
C言語 関数プロトタイプ宣言の...
-
浮動小数点の定数
-
DWORDの警告
-
C言語の型による処理速度の違い
-
C言語で台形公式を使った二重積...
-
C言語を実行すると-infが出てき...
-
int とdoubleの比較
-
C言語初心者 構造体 課題について
-
たくさんの数の平均を求める方...
-
EXE1→DLL→EXE2数値を受け渡す方法
-
プログラミングでのテイラー展開
-
C++初心者です。簡単なスコア計...
-
【C言語】二階微分方程式をル...
-
fgets()による繰り返し入力(c言語)
-
2分法で方程式の複数の解を自...
おすすめ情報