- ベストアンサー
構造体の纏めの後について……。
以前、『構造体の纏め方』と言うタイトルで質問した者です。 早速本題に。 // --------------- 構造体・鋳型宣言 --------------- typedef struct tagABC { int Dog; int Cat; } ABC; // ----------------------------------------------- // --------------- 構造体実体宣言 ----------------- ABC Point1[ 20 ][ 20 ] = { { { 10 , 11 }, { 20 , 21 }, { 30 , 31 } },{ { 100 , 101 }, { 200 , 201 } } }, Point2[ 20 ][ 20 ] = { { { 1000 , 1001 }, { 2000 , 2001 } } }, /************************************************/ /* 『ココが難題!!』 */ /************************************************/ *DBase[] = { Point1[ 0 ] , Point2[ 0 ] }; // ----------------------------------------------- さて、呼び出し側のソースコードは、 Point1[ 1 ][ 0 ] とすれば、 { 100 , 101 } を返してくれます。 *以後、この値が欲しいとして話を進めます しかし、 ( DBase + 0 )[ 1 ][ 0 ] と呼び出した場合、突然予定通りの値を返してくれません。 (コンパイルとビルドは通る) デバッガでメモリ上を見てみると、期待している値(上記)を呼び出す為には、 ( DBase + 0 )[ 0 ][ 20 ] となっており、普通ならばアクセス出来ない場所を指定しなければならなく、とても不思議な現象が起こっています。 因みに、 ( DBase + 0 )[ 1 ][ 0 ] と指定すると、結果的には、 Point2[ 0 ][ 0 ] を参照しているのと同じ現象が起こります。 この現象をどうにかして二次元配列で期待した値を呼び出せる方法を御教授御願いします。 使用コンパイラ:BCC 5.5.1
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
typedef ABC [20][20]すると見通しが良くなるので間違いにくくなるかと思います。 typedef struct tagABC { int Dog; int Cat; } ABC, ABCMatrix[20][20]; ABCMatrix *DBase[2] = { &Point1, &Point2 }; Point1[1][0] (*DBase[0])[1][0]
その他の回答 (2)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
ABC (*DBase[])[20][20]= { Point1, Point2 }; … printf("%d,%d\n",(*DBase[0])[1][0].Dog,(*DBase[0])[1][0].Cat);
- nitscape
- ベストアンサー率30% (275/909)
*DBase[] = { Point1[ 0 ] , Point2[ 0 ] }; と宣言しているので ( DBase + 0 )[ 1 ] はDBase[1]=Point2[0]ですよね。そのため ( DBase + 0 )[ 1 ][ 0 ] はPoint2[ 0 ][ 0 ]を参照していることになり、動作的には問題ないと思います。 DBaseを使って Point1[ 1 ][ 0 ] を参照したいのでしたらDBaseの宣言から変える必要があるかと思います。
お礼
回答有難う御座います。 DBaseの宣言から変える必要があると言うヒントから、 *DBase = { Point[ 1 ] , Point2[ 0 ] }; とポインタの矛先を変えて指定すると、見たい場所へは一応見れる事は見れましたが、利便性に優れない事が障害となってしまいました……;;;
お礼
回答、有難う御座います。 上記のヒントから、ちょちょっと手直ししたら、満足の行く動きをしてくれました。 どうも有難う御座いました!