ページ 11

配列の初期化方法

Posted: 2013年4月13日(土) 23:40
by namari

コード:

int MapData[75][37][8][24][32];//MapData[x値][y値][階層][縦の数][横の数]
このように宣言しました。
この配列の一つにつき、最初の要素である[x値][y値][階層]は要するにマップ番号を定めていて、
一回の初期化に付き、[縦の数][横の数]だけの24*32の数だけ初期化したいのです。
しかしやり方がさっぱり思いつきません。


コード:


MapData[45][7][1][24][32]={
2,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 
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,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,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, 2,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,2,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,2,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,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 
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,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,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, 
}
以上のような様子で、(どう見ても間違えていますが)
[45][7][1]というマップにおける[24]✕[32]のブロック状況を初期化したいです。
今のところ、以下のような苦行のような方法しか思いつきません。

コード:

MapData[45][7][1][0][0]=2;
MapData[45][7][1][0][1]=1;
MapData[45][7][1][0][2]=1;
MapData[45][7][1][0][3]=1;
MapData[45][7][1][0][4]=1;
・
・
・
MapData[45][7][1][23][28]=0;
MapData[45][7][1][23][29]=0;
MapData[45][7][1][23][30]=0;
MapData[45][7][1][23][31]=0;

Re: 配列の初期化方法

Posted: 2013年4月13日(土) 23:52
by zxc
  for文で回して初期化するかint array[256] = {0};と言う方法で初期化することになると思います。
それよりもまず、配列の次元が多いので、何らかの方法で整理するのが望ましいと思います。

Re: 配列の初期化方法

Posted: 2013年4月14日(日) 00:10
by namari
>for文で回して初期化するかint array[256] = {0};と言う方法で初期化することになると思います。
0以外の他の数字を入れたいので、forなどの方法では上手くいかないかと・・・

>それよりもまず、配列の次元が多いので、何らかの方法で整理するのが望ましいと思います。
そうなんですよね・・・
たとえば、配列名をMapdata1[24][32],Mapdata2[24][32]・・・にしていけば、この問題はなくなるとは思うんですが、
マップ移動の時に、既に最初の3次元で計算をおこなっていますので、できればこのまま変更なしの方が嬉しいです。
この問題以外はこの整理方法が最も動かしやすいので・・・すみません。

Re: 配列の初期化方法

Posted: 2013年4月14日(日) 00:57
by フリオ
 初期化用の配列を用意して、memcpyでコピーする、というのはどうでしょうか。

Re: 配列の初期化方法

Posted: 2013年4月14日(日) 07:49
by へにっくす
namari さんが書きました:

コード:

MapData[45][7][1][0][0]=2;
MapData[45][7][1][0][1]=1;
MapData[45][7][1][0][2]=1;
MapData[45][7][1][0][3]=1;
MapData[45][7][1][0][4]=1;
・
・
・
MapData[45][7][1][23][28]=0;
MapData[45][7][1][23][29]=0;
MapData[45][7][1][23][30]=0;
MapData[45][7][1][23][31]=0;
初期化の仕方がおかしい。

コード:

int MapData[45][7][1][24][32];
なら

コード:

MapData[44][6][0][23][31]=0;
とならなきゃウソだろう。
そもそも、
namari さんが書きました:マップ移動の時に、既に最初の3次元で計算をおこなっていますので、できればこのまま変更なしの方が嬉しいです。
この問題以外はこの整理方法が最も動かしやすいので・・・すみません。
最初は3次元だけだったんでしょ(個人的には3次元でも萎えますが 笑)?
何で5次元に増やした方が楽と思えるのか不思議だ。
私なら下記のようにするね。

コード:

// intでなく構造体にする。
typedef struct _tagNamari {
    int hoge[24][32];
} NAMARI;
NAMARI mapData[45][7][1];
void initNamari(NAMARI *n)
{
    NAMARI hoge = { /* 24 x 32 */ };
    memcpy(n, &hoge, sizeof(NAMARI));
}
// メインではこんな感じになるか?
// initNamari(&mapData[0][0][0]);

Re: 配列の初期化方法

Posted: 2013年4月14日(日) 16:37
by かずま
namari さんが書きました:

コード:

int MapData[75][37][8][24][32];//MapData[x値][y値][階層][縦の数][横の数]
このように宣言しました。
この配列の一つにつき、最初の要素である[x値][y値][階層]は要するにマップ番号を定めていて、
一回の初期化に付き、[縦の数][横の数]だけの24*32の数だけ初期化したいのです。
:::
[45][7][1]というマップにおける[24]✕[32]のブロック状況を初期化したいです。

コード:

#include <string.h>

int MapData[75][37][8][24][32];

int main(void)
{
    {
        static int a[24][32] = {
            2,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
        };
        memcpy(MapData[45][7][1], a, sizeof a);
    } 
    return 0;
}
static を忘れないように。
これをつけないと、a の初期化が実行されてから、
それが MapData[45][7][1] にコピーされます。

Re: 配列の初期化方法

Posted: 2013年4月14日(日) 19:43
by namari
>フリオさん
そうしました!ありがとうございます。

>へにっくすさん
配列の扱いが拙くてすみません。
なるほど。構造体を使えば、ややこしくなくて済むんですね。
ありがとうございます。

>かずまさん
こうやるんですか・・・全く思い浮かばなかったです。
僕はまだ配列の理解がしっかりできてないみたいですね。
これならかなりコードが短く済みそうです!

今回はほとんどかずまさんの方法そのまま導入しました。
本当にありがとうございました。

Re: 配列の初期化方法

Posted: 2013年4月15日(月) 01:42
by かずま
構造体をうまく使えば、memcpy は不要です。

コード:

int MapData[75][37][8][24][32];

int main(void)
{
    {
        static struct s { int a[24][32]; } a = {
            2,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1,
        };
        *(struct s *)MapData[45][7][1] = a;
    } 
    return 0;
}