二次元配列の初期化について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
あでぃ

二次元配列の初期化について

#1

投稿記事 by あでぃ » 12年前

二次元配列を利用して、800*600のMAPの当たり判定を作ろうと思い、数が多くなってしまったためfor文を利用して配列の初期化をしようとしたのですが、思った通りの結果を得られませんでした。
二次元配列を利用して、0から数字を一つずつ増やして文字を表示して思った通りに配列の数字を変更出来るか試してみたのですが、下記のプログラムでは600*400までの配列の初期化は出来るのですが、

コード:

#include "stdio.h"

int main(void){
	int ix,iy;
	int map[600][400];

	for(iy=0;iy<=599;iy++){
		for(ix=0;ix<=399;ix++){
			map[iy][ix]=ix+(iy*400);
			printf("%5d ",map[iy][ix]);
			if(ix>=399){
			printf("\n");
			}
		}
		
	}
	return 0;
}
下記のように600*500に変更をしてコンパイルをすると実行後強制終了してしまいます。

コード:

#include "stdio.h"

int main(void){
	int ix,iy;
	int map[600][500];

	for(iy=0;iy<=599;iy++){
		for(ix=0;ix<=499;ix++){
			map[iy][ix]=ix+(iy*500);
			printf("%5d ",map[iy][ix]);
			if(ix>=499){
			printf("\n");
			}
		}
		
	}
	return 0;
}
自分自身、C言語について学校で簡単なプログラムの作成をした程度で、このエラーの原因がわからずじまいです…
単純に自分のプログラムが間違えているのか、環境によって変わってくるのかもわからず、初めてこの掲示板で質問をさせていただきました。
もしよろしければ、ご指摘お願いいたします。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 二次元配列の初期化について

#2

投稿記事 by へにっくす » 12年前

そんなあなたはこれを参照すると幸せになれるかもしれない。
C言語-メモリスタック

要するにスタックメモリのサイズ1MBを超えてるんですね。
通常int型は4バイトとりますから、
600*400*4=960000バイト=937.5KB。約0.9155MB。
600*500*4=1200000バイト=1171.875KB。約1.1444MB。
(1MB=1024KB=1048576バイト)
written by へにっくす

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 二次元配列の初期化について

#3

投稿記事 by softya(ソフト屋) » 12年前

とりあえずローカル変数で大きな配列は作れない・作らない程度の認識で良いと思います。
static変数、グローバル変数にするか、mallocで動的確保するかを検討してください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 二次元配列の初期化について

#4

投稿記事 by みけCAT » 12年前

Linuxならulimitコマンドで、Windowsのgccならコンパイルオプションで、
それぞれスタック領域の大きさを増やすことができます。
必要なら、ググるか補足を待ってください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

あでぃ

Re: 二次元配列の初期化について

#5

投稿記事 by あでぃ » 12年前

へにっくすさん、softyaさん、みけCATさん、返信ありがとうございました。
参考URLを見させていただき、今回のエラーの原因とメモリ確保について調べてみました。
ひとまず、今回は変数をstatic変数に変更して無事動作させることが出来ました。ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る