• ベストアンサー

構造体の纏めの後について……。

以前、『構造体の纏め方』と言うタイトルで質問した者です。 早速本題に。 // --------------- 構造体・鋳型宣言 --------------- 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

質問者が選んだベストアンサー

  • ベストアンサー
  • const
  • ベストアンサー率66% (12/18)
回答No.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]

jam_with_ju2
質問者

お礼

回答、有難う御座います。 上記のヒントから、ちょちょっと手直ししたら、満足の行く動きをしてくれました。 どうも有難う御座いました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

ABC (*DBase[])[20][20]= { Point1, Point2 }; … printf("%d,%d\n",(*DBase[0])[1][0].Dog,(*DBase[0])[1][0].Cat);

全文を見る
すると、全ての回答が全文表示されます。
  • nitscape
  • ベストアンサー率30% (275/909)
回答No.1

*DBase[] = { Point1[ 0 ] , Point2[ 0 ] }; と宣言しているので ( DBase + 0 )[ 1 ] はDBase[1]=Point2[0]ですよね。そのため ( DBase + 0 )[ 1 ][ 0 ] はPoint2[ 0 ][ 0 ]を参照していることになり、動作的には問題ないと思います。 DBaseを使って Point1[ 1 ][ 0 ] を参照したいのでしたらDBaseの宣言から変える必要があるかと思います。

jam_with_ju2
質問者

お礼

回答有難う御座います。 DBaseの宣言から変える必要があると言うヒントから、 *DBase = { Point[ 1 ] , Point2[ 0 ] }; とポインタの矛先を変えて指定すると、見たい場所へは一応見れる事は見れましたが、利便性に優れない事が障害となってしまいました……;;;

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 構造体について

    私は今プログラミング(C++)を勉強しているのですが、構造体に苦戦しています。分からないことがいくつかあります。もし知っていたらどれでもいいですので、よろしければ教えてください。 1、たとえば構造体を宣言するときに struct abc{ int s; struct abc xx; struct abc yy; }; と宣言するときがあります。でも上記の例と下記の例との違いが分かりません。 struct abc{ int s; struct abc xx; struct abc yy; }abc; 2、たとえばメインの最初にこのように宣言されているとします。 int j, i; struct abc *kk, *nn, *mm; これはここに宣言したものがローカルで、1のときに宣言したものがグローバルと考えていいのでしょうか? 3、メインの中に次のようなプログラムがあったとします。 kk->xx = j; kk->yy = j; nn->yy = NULL; i = kk->xx; i = kk; これらがそれぞれどのような意味があるのでしょうか。 これらでわかることがあればぜひ教えてください。よろしくお願いいたします。

  • C#で構造体の配列を持った構造体を使いたいのですが

    C#で構造体の配列を持った構造体を使いたいのですが Cならば struct xyz { struct abc _abc[32]; int index; }; struct abc { int a; int b; int c; }; struct xyz _xyz[8]; xyz[0]._abc[3].b = 1; のような使い方で という感じで やっていた事を C#で 同じような事をやろうとしても うまくいきません うまくやる方法をどなたかご存知ないでしょうか Visual Studio 2005行った場合 コンパイルで 構文エラーです。不適切な配列の宣言子です。マネージ配列を宣言するには、次元指定子を変数の識別子の前に指定します。固定サイズ バッファ フィールドを宣言するには、フィールド型の前に fixed キーワードを使用します となり fixed をつけると 固定サイズ バッファの型は次のうちの 1 つでなければなりません: bool、byte、short、int、long、char、sbyte、ushort、uint、ulong、float または double となってしまいます

  • 構造体の中の構造体

    typedef struct number{ int x; struct number *next; }Num; 初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか? typedef struct number{ int x; int y; }Num; の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・

  • 構造体の返し方

    こういう構造体があるとして、 typedef struct Day{  int day1, day2, day3; } Day; このような関数で値を入れて、 int DayTest (char s) {  Day day;  day1 = 2003;  day2 = 12;  dat3 = 31;  return < ここの返し方がわからない >; } これを main() 関数で参照できるようにするには どうすればいいのでしょうか。 printf で出力させるとかで結構です。 ポインタだとは思うのですが、うまくいきません。

  • 構造体の構造体配列初期化

    typedef strunct _test01 { int a; int b; } test01_t; typedef strunct _test { int c; test01_t sTest01[256]; } test_t; test_t sTest; 上記のような構造体がある場合、sTestのメンバのsTest01をNULL初期化する 方法とsTest01に値が入っていないか(初期化されているか)を判定する方法を 教えていただけませんか? よろしくお願い致します。

  • 構造体について

    構造体についての質問です。 main関数で構造体に 格納しています。 その構造体の値を 自作の関数(look)で 参照したいのですが どのようにすればいいのか ご教示して頂けたら幸いです。 typedef struct nentbl_ { int tosi; int kan; } nentbl; //--------------------------------------------------- int look(id){ nentbl kihokyu[50]; printf("%d %d\n",kihokyu[id].tosi , kihokyu[id].kan); } //---------------------------------------------------- int main(void){ nentbl kihokyu[50]; ・ ・ ・ kihokyu[1].tosi =11; kihokyu[1].kan = 20; kihokyu[2].tosi = 21; kihokyu[2].kan = 30; kihokyu[3].tosi = 31; kihokyu[3].kan = 40; y = look(1);

  • 構造体・ビットフィールドのvolatileに関して。

    以下のような構造体があったとする。 -(1) -----------------------------  typedef volatile struct ABC{    char x;    char y;  }stABC; -(2) -----------------------------   typedef struct ABC{    volatile char x;    volatile char y;  }stABC; --------------------------------- ■質問  -------------   stABC abc;   abc.x // ←volatileは有効?   abc.y // ←volatileは有効?  ------------- ・このとき、メンバx,y は(1)/(2)の構造体型宣言どちらでも  同じ意味合いになっているのでしょうか。  ※特に(1)の場合、volatileは有効になっているのでしょうか。 ・ビットフィールド時も同じと考えて問題ないでしょうか。   (1)typedef volatile struct ABC{      char x: 1 ;      char x: 7 ;    }stABC;   (2)typedef struct ABC{      volatile char x: 1 ;      volatile char x: 7 ;    }stABC;

  • 入れ子の構造体について

    例えば、入れ子の構造体を1つ使いたい場合、 struct bbb{ int b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; と書くと、「dt.a.b = 10」とやれば、値等を設定できると思いますが、 入れ子の構造体を2つ使いたい場合も、同じように書けるのでしょうか? struct ccc{ int c; }; struct bbb{ struct ccc b; }; typedef struct aaa{ struct bbb a; }AAA; AAA dt; dt.a.b.c = 10; と書けるのでしょうか?こんがらがってしまって、どう書いていいのか・・。 2つでも出来るのであれば、コードの書き方を教えて頂けませんか?

  • 構造体メンバへの代入

    とても初歩的なことなのですが、 typedef struct _X{ int x; }X[50]; と構造体を定義して X[0].x = 0; と0を代入しようとすると、「宣言が正しく終了していない」とエラーが出てしまいます。 これはなぜでしょうか? ちなみにMicrosoft Visual C++ 2005 Express Editionを使っています。

  • ヘッダファイルと構造体

    typedef struct{ float x; float y; float z; }Point; typedef struct { struct Point p1; struct Point p2; }Rect; とヘッダファイルに入力しコンパイルしてみると struct Point p1; struct Point p2; のPointが未定義の構造体とエラーが出ます。 どのように書けばいいのでしょう??