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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
moba
記事: 82
登録日時: 8年前

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

#1

投稿記事 by moba » 8年前

初歩的な質問ですみません。右と左も分からぬ初心者です。
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 スタイル キャストまたは関数スタイルのキャストが必要です。

と表示されます。

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

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

#2

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

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

【補足】
純粋に技術的な意味で2次元配列を理解したいのであれば、それはそれで意味があるので勉強してもよいと思います。
少なくとも一気にはnewで確保できません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

moba
記事: 82
登録日時: 8年前

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

#3

投稿記事 by moba » 8年前

ありがとうございます。
構造体のポインタ等と自分は書きましたが、
肝は二次元配列の動的確保の部分だったんですね!

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

コード:

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

閉鎖

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