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

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

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

#1

投稿記事 by yamataro » 15年前

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

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

とやっているのですが、

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

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

やっくん

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

#2

投稿記事 by やっくん » 15年前

こんばんは。私自身、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:二次元配列の動的確保について

#3

投稿記事 by やっくん » 15年前

上記の手法ではメモリが連続した位置に確保されてないので、もし局所性を考えて連続した場所に確保したいならば使用するメモリを一度に確保し、その後にポインタで細かく指していくと良いです。

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

softya

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

#4

投稿記事 by softya » 15年前

2次元配列に展開せずに一次元配列に展開して、
map[x+(map_x*y)];
でアクセスした方が読み込みも楽ですしお勧めです。

yamataro

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

#5

投稿記事 by yamataro » 15年前

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

閉鎖

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