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

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

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

#1

投稿記事 by こめかみ » 16年前

環境VC++2008EEと最新版のDXライブラリの中のサンプルプログラムを改造し、
ライフゲームを作ろうと思って

640×480の画面に64×48のマス目を描画しようと


#define FIELD_Y 47
//0~47
#define FIELD_X 63
//0~63
int field[FIELD_Y][FIELD_X] = {0};

このように初期化したのですが下段二行がチラホラとゼロクリアされていないようです。
FIELD_Yの値を49にすることで問題は回避できますが、
気になったので調べてみてもわかりませんでした。

初期化の仕方が間違っているのでしょうか。
ソースコードを載せますのでアドバイスいただけたら幸いです。ソースファイル名はtest.cppです。
#define FIELD_Y 47
//0~47
#define FIELD_X 63
//0~63
#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode(TRUE);	// ウィンドウモードに指定
	if( DxLib_Init() == -1 ){return (-1);}	// DXライブラリ初期化処理、 エラーが起きたら直ちに終了
	
	int field[FIELD_Y][FIELD_X] = {0};

/*
	for(int j=1; j < FIELD_Y; ++j)
	{
		for(int i=1; i < FIELD_X; ++i)
		{
			field[j] = 1;
		}
	}
*/
	SetDrawScreen(DX_SCREEN_BACK);		//描画対象画面の指定

	
	//	メインループ
	while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0)
	{

		ClsDrawScreen();	//画面の消去

		int x=0,y=0;
		int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);
		
		/*
		if(key & PAD_INPUT_UP	)	y-=8;
		if(key & PAD_INPUT_DOWN	)	y+=8;
		if(key & PAD_INPUT_LEFT	)	x-=8;
		if(key & PAD_INPUT_RIGHT)	x+=8;
		*/

		for(int j=0; j <= FIELD_Y; ++j)
		{
			for(int i=0; i <= FIELD_X; ++i)
			{
				int x = i*10;
				int y = j*10;

				if(field[j] == 1)
				{
					DrawBox( x, y, x+9, y+9, GetColor(255,0,0) , TRUE ) ;	// 赤い箱の描画
				}
				else
				if(field[j] == 0)
				{
					DrawBox( x, y, x+9, y+9, GetColor(255,0,0) , FALSE ) ;	// 赤い枠の描画
				}
				else
				{
					DrawBox( x, y, x+9, y+9, GetColor(255,255,255) , FALSE ) ;	// 白い箱の描画
				}

			}
		}

		ScreenFlip();	//画面の切り替え

	}

	DxLib_End() ;				//	DXライブラリ使用の終了処理
	return 0 ;					//	終了
}

こめかみ

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

#2

投稿記事 by こめかみ » 16年前

あれ、投稿するソースにしてはちょっとゴチャゴチャしてると後から気づきました。

直してきます。

こめかみ

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

#3

投稿記事 by こめかみ » 16年前

直してきました。

症状の画像も添付します。
#define FIELD_Y 47
//0~47
#define FIELD_X 63
//0~63

#include "DxLib.h"

int x,y;
//描画用の座標変数

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode(TRUE);	// ウィンドウモードに指定
	if( DxLib_Init() == -1 ){return (-1);}	// DXライブラリ初期化処理、 エラーが起きたら直ちに終了
	
	int field[FIELD_Y][FIELD_X] = {0};

	SetDrawScreen(DX_SCREEN_BACK);		//描画対象画面の指定

	
	//	メインループ
	while(ProcessMessage()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0)
	{

		ClsDrawScreen();	//画面の消去

		for(int j=0; j <= FIELD_Y; ++j)
		{
			for(int i=0; i <= FIELD_X; ++i)
			{
				x = i*10;
				y = j*10;
				//行と列のナンバー×10でマスの座標をつくる

				if(field[j] == 1)
				{
					DrawBox( x, y, x+9, y+9, GetColor(255,  0,  0) , TRUE ) ;	// 赤い箱の描画
				}
				else
				if(field[j] == 0)
				{
					DrawBox( x, y, x+9, y+9, GetColor(255,  0,  0) , FALSE ) ;	// 赤い枠の描画
				}
				else
				{
					DrawBox( x, y, x+9, y+9, GetColor(255,255,255) , FALSE ) ;	// 白い箱の描画
				}

			}
		}

		ScreenFlip();	//画面の切り替え

	}

	DxLib_End() ;				//	DXライブラリ使用の終了処理
	return 0 ;					//	終了
}

初級者

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

#4

投稿記事 by 初級者 » 16年前

[0]~[47]
の添字にアクセスしたければ、
配列の定義は[48]です。
基本中の基本です。

こめかみ

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

#5

投稿記事 by こめかみ » 16年前

あれ、そうですね。
加えて、MAPのマスの数え方で何か勘違いしてたみたいです。

おかげさまで先に進めますありがとうございました。

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

#6

投稿記事 by » 16年前

int field[FIELD_Y][FIELD_X] = {0};
なのですが最後の配列しか0で初期化してないでしょうか?
すべての配列を初期化ししたいのでしたらZeroMemory関数を使うか
for(int i=0; i<FIELD_Y; i++){
	for(int j=0; j<FIELD_X; j++){
		field[j] = 0;
	}
}

かかないとだめかもしれません

pooka

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

#7

投稿記事 by pooka » 16年前

>int field[FIELD_Y][FIELD_X] = {0};
>なのですが最後の配列しか0で初期化してないでしょうか?
初期化子の数が要素数より少ない場合、残りは0で初期化されたと思うのでこれでいいと思います。

過去ログですが
ttp://www.play21.jp/board/formz.cgi?action=res&resno=21471&page=&lognum=68&id=dixq&rln=214711223279778

閉鎖

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