ページ 11

二次元配列の動的確保について

Posted: 2010年10月07日(木) 21:36
by yamataro
最近久しぶりにゲームを作って、テキストファイルからマップデータのロードをやっているんですが、
ポインタ変数にnewでint型の二次元配列がつくれません。僕は

int** map;
map = new int[map_y][map_x];

とやっているのですが、

・定数式が必要(関数 map_change(char *) )
・'int ( *)[1]' 型は 'int * *' 型に変換できない(関数 map_change(char *) )

というエラーが出ます(コンパイラはBorland C++です)。
なんかやり方自体違う気がするんですが、どうしたらいいでしょうか?

Re:二次元配列の動的確保について

Posted: 2010年10月07日(木) 21:55
by やっくん
こんばんは。私自身、newではなくmallocを使うのであまり詳しくは無いですが、以下のようにしてはどうでしょう?

int **map;

map = new int* [map_y];
for(int i = 0; i < map_y; i++)
map = new int[map_x];

mapの下にint*を確保し、さらにその下のそれぞれにint型を確保しています。

<追記>
deleteする際は確保と順番を逆にして、

for(int i = 0; i < map_y; i++)
if(map) delete[/url] map;

if(map) delete[/url] map; 画像

Re:二次元配列の動的確保について

Posted: 2010年10月07日(木) 22:10
by やっくん
上記の手法ではメモリが連続した位置に確保されてないので、もし局所性を考えて連続した場所に確保したいならば使用するメモリを一度に確保し、その後にポインタで細かく指していくと良いです。

http://d.hatena.ne.jp/Schima/searchdiar ... ype=detail

Re:二次元配列の動的確保について

Posted: 2010年10月07日(木) 22:12
by softya
2次元配列に展開せずに一次元配列に展開して、
map[x+(map_x*y)];
でアクセスした方が読み込みも楽ですしお勧めです。

Re:二次元配列の動的確保について

Posted: 2010年10月07日(木) 23:08
by yamataro
やっぱり、一次元配列でやるほうが簡単そうだったので、
softyaさんのやり方を採用させていただきました。
おかげで、ちゃんとファイルからマップのロードを行うことができました。
みなさん、ご回答ありがとうございました!