ページ 11

構造体の二次元配列ポインタの動的な確保

Posted: 2015年12月18日(金) 18:08
by moba
初歩的な質問ですみません。右と左も分からぬ初心者です。
RPGのマップの構造体を、二次元配列で、サイズを変数で指定して実体化したいです。
OSはVista、IDEはVC++2010Expressです。
エラーが出るのはこの箇所です。

コード:

struct Cell
{
	int chipID;
	int canWalk;
};//ここまでヘッダファイル内

int cellNumX = 20;
int cellNumY = 15;
Cell* cell;
cell = new Cell[cellNumX][cellNumY];//cppファイル内
一次元配列ではエラーが出なかったのですが、
newでは二次元配列ポインタ(正しい呼び方?)は作れないのでしょうか。
検索もしたのですが分からず、似た例も見けられませんでした。
上記のことを実現する方法があったら教えていただけますか。

10行目の部分では、赤波線が引いてあるのでカーソルを会わせると
「Error:式には定数値が必要です」

コンパイル時には、10行目の部分で
 error C2540: 配列のバウンドが定数式ではありません。
 error C2440: '=' : 'Cell (*)[1]' から 'Cell *' に変換できません。
 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

と表示されます。

Re: 構造体の二次元配列ポインタの動的な確保

Posted: 2015年12月18日(金) 20:53
by softya(ソフト屋)
上級者やプロの場合、2次元配列は確保、解放が面倒で、バグった時の調査も難しくなるので出来るだけ利用しません。
マップであれば、Y座標毎にXのサイズが可変することなど無いはずなので1次元配列を計算で2次元配列のように利用するのが簡単です。

【補足】
純粋に技術的な意味で2次元配列を理解したいのであれば、それはそれで意味があるので勉強してもよいと思います。
少なくとも一気にはnewで確保できません。

Re: 構造体の二次元配列ポインタの動的な確保

Posted: 2015年12月18日(金) 22:45
by moba
ありがとうございます。
構造体のポインタ等と自分は書きましたが、
肝は二次元配列の動的確保の部分だったんですね!

余計なキーワードが外れて、ネット検索からも情報を得ることができました。
理由は分からないのですが、仕様として動的に確保できる配列は一次元までなんですね。
ポインタのポインタを使って擬似的に再現するよりも、一次元配列の領域を二次元配列のように使う方が便利ということですね。

コード:

GetCell_chipID(x,y){
return(cell[x + y*cellNumX].chipID)
}
こんな具合で一次元配列を使ってみました。コンパイルまであと一歩!