マップの二次元配列がmain.cppに来ると初期化されるのが分からない。

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

マップの二次元配列がmain.cppに来ると初期化されるのが分からない。

#1

投稿記事 by RPG_SYOSINSYA » 14年前

RPGを書いているC++一年目のものですが、今回RPGを作ろうと思い立ち、さっそく書き始めたのですが、しょっぱなからつまずいてしまいオロオロしている状態です。
プログラム構造としては、main.cppはGlovalVariable.hを読み込み、その他の.cppにはGlovalVariable.hの中身に宣言の最初にexternをつけたExternGV.hを読み込んでいる感じです。
マップデータをmain.cppのDxLibを使う前の空間でグローバル宣言のように定義するとできるのですが、main.cpp以外の.cppファイルの中で関数で初期化すると、なぜか配列に何も入ってない状態になってしまいます。ここを、関数内で定義した二次元配列を全部の.cpp内(main.cppも含め)で共有したいのですが、分からないので、質問させていただきました。

コード:

#include "DxLib.h"
#include "EXternGV.h"
void Format(){
	int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] =
	{
		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
		{ 0, 1, 1, 0, 0, 0, 0, 0, 0, 0 ,  1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
		{ 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 ,  1, 0, 0, 0, 0, 0, 0, 0, 1, 0 } ,
		{ 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 ,  1, 1, 1, 1, 1, 1, 0, 0, 1, 0 } ,
		{ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0 ,  0, 0, 0, 0, 0, 1, 0, 0, 1, 0 } ,
		{ 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 ,  0, 0, 1, 1, 1, 1, 1, 0, 1, 0 } ,
		{ 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 ,  0, 0, 1, 0, 0, 1, 1, 0, 1, 0 } ,
		{ 0, 1, 0, 0, 1, 0, 0, 1, 1, 0 ,  0, 0, 1, 0, 0, 1, 1, 0, 1, 0 } ,

		{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 ,  0, 1, 1, 0, 0, 1, 1, 0, 1, 0 } ,
		{ 0, 0, 0, 0, 1, 0, 0, 1, 0, 0 ,  0, 1, 1, 0, 0, 1, 1, 0, 1, 0 } ,
		{ 0, 0, 0, 0, 1, 0, 0, 1, 0, 0 ,  0, 1, 1, 0, 0, 1, 1, 0, 1, 0 } ,
		{ 0, 0, 0, 1, 1, 0, 0, 1, 0, 0 ,  0, 1, 1, 0, 0, 1, 1, 0, 1, 0 } ,
		{ 0, 1, 1, 1, 1, 0, 0, 1, 1, 1 ,  1, 1, 1, 0, 0, 1, 1, 0, 1, 0 } ,
		{ 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 ,  0, 0, 0, 0, 0, 0, 0, 0, 1, 0 } ,
		{ 0, 1, 1, 1, 1, 0, 0, 0, 0, 0 ,  0, 0, 0, 0, 0, 0, 0, 0, 1, 0 } ,
		{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
	} ;
}
もちろん両者の.hではexternn int MapData[ MAP_HEIGHT ][ MAP_WIDTH ];がExternGV.hに、ないパターンGlobalVariable.hに書かれています。
main.cpp内部ではextern Format();として読み込んでいます。

質問の仕方が分からなくて・・・。どこのファイルがないと分からないなどとコメントいただければ幸いです。

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

Re: マップの二次元配列がmain.cppに来ると初期化されるのが分からない。

#2

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

関数内にあるMapDataはローカル変数ですのでグローバル変数として共有することは出来ません。関数外に出す必要があります。
それとextern Format();と言うのも別ファイルから関数の呼び出しを可能にするだけなので意味はありません。
ただ、やたらグローバル変数を使う設計も良くないので、もう少しC言語の変数の仕組みを勉強したほうが良いと思います。

参考に私が書いたRPG作成の講座をご覧になってみてください。
「マイ 日記 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&sd=a&c=2
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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