ページ 11

クラスでの2次元配列の初期化ができない

Posted: 2011年9月20日(火) 18:44
by アップル鈴木
現在課題研究にて横シューティングゲームを作っています。
移動や敵の弾との当たり判定などは実装できたので、マップの当たり判定を2次元配列で実装しようと思ったのですが、配列の初期化ができていないようで困っています。
いろいろ書き方を変えてみたりしても変わらず、検索しても具体的な初期化方法が見つからなかったのでここで質問することにしました。
コード全てを乗せると量が多すぎると思うので関係ありそうな部分を抜き出しましたが、情報が足りないのであれば載せようと思います。
なんかしょうもない部分でつまづいてる気もしますがお願いしますm(__)m

環境 VisualC++2010

コード:

//CPrayer.h
#ifndef DEF_CPLAYER_H //二重include防止
#define DEF_CPLAYER_H
class CPlayer 
{
public:
	int karihantei[12][20];//仮の地形判定
        CPlayer();
};
#endif

コード:

//CPlayer.cpp
#include"CPlayer.h"
#include"DxLib.h"

CPlayer::CPlayer(){ 
karihantei[12][20]={//ここの「{」で「式が必要です」エラー
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0},
	{0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0},
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};
}
エラーコード
※本来のコードでは配列の初期化は26行目から始めているので下のようなエラーコードになります
cplayer.cpp(26): error C2059: 構文エラー : '{'
cplayer.cpp(26): error C2143: 構文エラー : ';' が '{' の前にありません。
cplayer.cpp(27): error C2143: 構文エラー : ';' が '}' の前にありません。
cplayer.cpp(27): error C2143: 構文エラー : ';' が ',' の前にありません。
cplayer.cpp(28): error C2143: 構文エラー : ';' が '{' の前にありません。・・・
(以下ズラーッと38行まで続く)

Re: クラスでの2次元配列の初期化ができない

Posted: 2011年9月20日(火) 19:32
by a5ua
クラスの配列メンバーは、宣言と同時に初期化することができないので、
以下のように、ローカル変数で値を設定した後、コピーするという方法が考えられます。
(C++の最新規格であるC++11では、initializer_listによる初期化が可能だが、Visual C++は現在未対応)

コード:

CPlayer::CPlayer()
{
	// ローカル変数で初期値を設定
	int temp[12][20] = {
	    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	    {0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0},
	    {0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0},
	    {0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0},
	    {0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0},
	    {0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0},
	    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
	};
	
	// メンバー変数にコピー
	memcpy(karihantei, temp, sizeof temp);
}

Re: クラスでの2次元配列の初期化ができない

Posted: 2011年9月20日(火) 22:10
by アップル鈴木
>>a5uaさん
たしかにそのような方法は昨日調べた限りでは見つけられませんでした・・・
コードを変更したところエラーなくビルド出来、当たり判定自体もうまく機能してくれました。これで大丈夫そうです。
また何か詰まったら質問すると思いますが、その時はまたお願いします。

Re: クラスでの2次元配列の初期化ができない

Posted: 2011年9月20日(火) 23:32
by かずま
a5ua さんが書きました:

コード:

CPlayer::CPlayer()
{
	// ローカル変数で初期値を設定
	int temp[12][20] = {
	    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
int temp[12][20] の前に static をつけたほうがいいでしょう。

Visual Studio 2008 コマンドプロンプトを開き、
cl -c cplayer.cpp でコンパイルし、
dumpbin -disasm cplayer.obj で逆アセンブルすると、
そのコンストラクタのコードサイズが 2356バイトだと分かります。
static があると、そのサイズは 36バイトです。

static がないと、

コード:

    int temp[12][20];
    temp[0][0] = 0;
    temp[0][1] = 0;
        :
    temp[11][19] = 1;
と同じことになるからです。