• ベストアンサー

構造体の配列とメンバの配列

typedef struct _ex_table1 {   int  x[10];   int  y[10]; }ETable1; ETable1 et1; int ans1; for( int a = 0; a < 10; a++ ){   et1.x[a] = a+10;   et1.y[a] = a*2; } for( int b = 0; b < 10; b++ ){   if( et1.x[b] == 15 ){     ans1 = et1.y[b];     break;   }   else{     ans1 = 0;   } } printf( "%d", ans1 ); ///////////////////////////////// typedef struct _ex_table2 {   int xx;   int yy; }ETable2; ETable2 et2[10]; int ans2; for( int aa = 0; aa < 10; aa++ ){   et2[aa].xx = aa+10;   et2[aa].yy = aa*2; } for( int bb = 0; bb < 10; bb++){   if( et2[bb].xx == 15 ){     ans2 = et2[bb].yy;     break;   }   else   {     ans2 = 0;   } } printf("%d", ans2 ); と言う感じに、微妙にソースを書いてみたのですが、 上のメンバ(x,xx)の値が正しいものがあったら、 対応する下のメンバ(y,yy)を出力したいと思っていますが、 構造体を配列にした場合と、構造体メンバを配列にした場合は どのように違うのでしょうか? 私には、同じように思えてしまいます。 どなたか、利点・欠点など教えていただけませんか? よろしくお願い致します。

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

  • ベストアンサー
  • madman
  • ベストアンサー率24% (612/2465)
回答No.2

どちらでも同じですが、 typedef struct _ex_table1 {   int  x[10];   int  y[10]; }ETable1; ETable1 et1; だと、x[0]とy[0]の関連がソースを見て判断できません。 それぞれ個別の配列となってしまい配列番号nに入るxとyに関連があるようには見えないのです。 しかし、 typedef struct _ex_table2 {   int xx;   int yy; }ETable2; ETable2 et2[10]; とすれば、xxとyyに関連が生まれ、配列番号n番目のデータとして識別しやすくなります。 またSUB関数コール時に配列番号nに入っている情報だけを渡したい場合 ETable1では sub(et1.x[n], et1.y[n]); int sub(x, y) {  : } と渡さなければならないですが、 ETable2では sub(et2[n]); int sub(ETable2 et) {  : } で渡せます。 プログラムを作る時に、ひとつの塊としてみたいものをメンバとして並べ、それを必要数だけ用意する。ように作成します。 上記例であれば、xとyは対の情報であると判断できますので、 前者の書き方はよくない書き方で、後者のかきかたはよい書き方となります。

coolguys
質問者

お礼

sub関数を造ったときのことを考えると分かりやすかったです。 値を渡すのがひとつでよくなり、 記述のし忘れが減ってデバックも簡単になりますね。 ありがとうございました。

その他の回答 (1)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.1

ご質問の二つのプログラムについては、得られる効果は同じだと思います。 どちらが適切かというのは、そのデータが何を示しているかによります。 例えば、5匹のタコの足を扱うプログラムがあったとします。 (変な例えですが、ゲームプログラム等でそんな必要があったと考えて下さい。) 下のどれが適切だと思いますか。(Legは適当に定義された型とします。) (1) typedef struct {  Leg leg[8*5]; } Octpus; Octpus tako; (2) typedef struct {  Leg leg[8]; } Octpus; Octpus tako[5]; (3) typedef struct {  Leg leg; } Octpus; Octpus tako[8*5]; (1)や(3)は不自然だと思いませんか? 要はプログラマが見て理解しやすいコードを書けばよいわけです。

coolguys
質問者

お礼

ありがとうございます。 サンプルなどからコピペばっかりしていたために、 基礎部分が分かりませんでした。 結果は同じなのですね。 見易さの問題ですか、なるほど。

関連するQ&A