配列の初期化方法

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

配列の初期化方法

#1

投稿記事 by namari » 12年前

コード:

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;

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

Re: 配列の初期化方法

#2

投稿記事 by zxc » 12年前

  for文で回して初期化するかint array[256] = {0};と言う方法で初期化することになると思います。
それよりもまず、配列の次元が多いので、何らかの方法で整理するのが望ましいと思います。

アバター
namari
記事: 111
登録日時: 12年前

Re: 配列の初期化方法

#3

投稿記事 by namari » 12年前

>for文で回して初期化するかint array[256] = {0};と言う方法で初期化することになると思います。
0以外の他の数字を入れたいので、forなどの方法では上手くいかないかと・・・

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

フリオ

Re: 配列の初期化方法

#4

投稿記事 by フリオ » 12年前

 初期化用の配列を用意して、memcpyでコピーする、というのはどうでしょうか。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: 配列の初期化方法

#5

投稿記事 by へにっくす » 12年前

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]);
written by へにっくす

かずま

Re: 配列の初期化方法

#6

投稿記事 by かずま » 12年前

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] にコピーされます。

アバター
namari
記事: 111
登録日時: 12年前

Re: 配列の初期化方法

#7

投稿記事 by namari » 12年前

>フリオさん
そうしました!ありがとうございます。

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

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

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

かずま

Re: 配列の初期化方法

#8

投稿記事 by かずま » 12年前

構造体をうまく使えば、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;
}

閉鎖

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