配列の配列

[戻る]
ろろ 2006/07/20(木) 10:22:58
2次元配列のさらに配列を作りたいのですがうまくいきません。
以下のプログラムのようにしてもコンパイルエラーがでます。
どうすれば可能になるでしょうか?

int    aaa[2][3];
int    bbb[2][3];
int    ccc[2][3];

//int (int(*)[2][3])ddd[3] = {aaa,bbb,ccc}; //エラー
//int (int(*ddd)[2][3])[3] = {aaa,bbb,ccc}; //エラー
int (*ddd)[2][3])[3] = {aaa,bbb,ccc}; //エラー

int a,b,c;
a = ddd[0][0][0];    //aaa[0][0]を取りたい
b = ddd[1][0][0];    //bbb[0][0]を取りたい
c = ddd[2][0][0];    //ccc[0][0]を取りたい

気分屋 2006/07/20(木) 10:35:03
VC6.0にてコンパイル確認。

#include <stdio.h>

int main( void )
{
    int    aaa[2][3] = { 0 };
    int    bbb[2][3] = { 0 };
    int    ccc[2][3] = { 0 };
    int    (*ddd[])[3] = { aaa, bbb, ccc };

    aaa[0][0] = 10;
    bbb[0][0] = 20;
    ccc[0][0] = 30;

    printf( "%d, %d, %d\n", ddd[0][0][0], ddd[1][0][0], ddd[2][0][0] );

    return 0;
}

ろろ 2006/07/20(木) 10:48:55
ありがとうございます。
正常にコンパイルされまして値も取れました。

ただ、[2]の情報が指定されていないせいか、
ウォッチで確認しようとしてもみれません。
[2]を指定するやり方はありますでしょうか?
単純に、
int    (*ddd[2][3])[3] = { aaa, bbb, ccc };
としてもコンパイルエラーでうまくいきませんでした。

気分屋 2006/07/20(木) 11:10:25
ちょっと私には、他のやり方を知りません。
知っている方にお任せします。

ただ単純にウォッチ内で値を見るなら
ウォッチに「ddd」と記述するのではなく
ddd[0][0]
ddd[0][1]
ddd[1][0]
ddd[1][1]
ddd[2][0]
ddd[2][1]
と記述してやれば見れなくはありませんが
根本的な解決ではないですね。

tetrapod 2006/07/20(木) 11:17:20
えー、欲しいのは本当に「配列の配列」でしょうか。
提示例は「【配列へのポインタ】の配列」ですから想定のものとは違います。
それとも、既存の配列3つを初期値とする新しい別の配列を作りたい?

typedef int a23[2][3];
a23* d[3]={ &a, &b, &c}; なら「【配列へのポインタ】の配列」と理解できますか?
ならばこの typedef を展開して int (*d[3])[2][3]={&a,&b,&c}; とします。

ろろ 2006/07/20(木) 11:49:06
レスありがとうございます。

>えー、欲しいのは本当に「配列の配列」でしょうか。
>提示例は「【配列へのポインタ】の配列」ですから想定のものとは違います。
>それとも、既存の配列3つを初期値とする新しい別の配列を作りたい?
やりたいことの正確な名前はよくわかりませんが、
aaa,bbb,cccの名前の違う配列をループで処理したいです。
こんな感じで、
for(i=0;i<3;i++)
{
  printf("%d ",ddd[i][0][0]);
}

>int (*d[3])[2][3]={&a,&b,&c}; 
試してみたらエラーがでました。
どこか間違っていますか?

int    aaa[2][3];
int    bbb[2][3];
int    ccc[2][3];

int (*ddd[3])[2][3]={&aaa,&bbb,&ccc}; 

int a,b,c;
a = ddd[0][0][0];    //エラー
b = ddd[1][0][0];    //エラー
c = ddd[2][0][0];    //エラー

エラー内容:
'int [3]' から 'int' に変換することはできません。

DD. 2006/07/20(木) 12:13:37
int (*ddd[3])[2][3] = { &aaa, &bbb, &ccc };
aaa, bbb, ccc のアドレスを渡しているので、

a = *ddd[0][0][0];
b = *ddd[1][0][0];
c = *ddd[2][0][0];
となります。

ろろ 2006/07/20(木) 12:37:07
[[解決]]
レスありがとうございます。
DD.さんのやり方でコンパイルできました。
ただ、ウォッチはおかしいままです。

ウォッチは重要でないしあきらめることにします。
皆さんありがとうございました。

古いスレッドには追加発言できません。