- ベストアンサー
構造体の配列とメンバの配列
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)を出力したいと思っていますが、 構造体を配列にした場合と、構造体メンバを配列にした場合は どのように違うのでしょうか? 私には、同じように思えてしまいます。 どなたか、利点・欠点など教えていただけませんか? よろしくお願い致します。
- みんなの回答 (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は対の情報であると判断できますので、 前者の書き方はよくない書き方で、後者のかきかたはよい書き方となります。
その他の回答 (1)
- ranx
- ベストアンサー率24% (357/1463)
ご質問の二つのプログラムについては、得られる効果は同じだと思います。 どちらが適切かというのは、そのデータが何を示しているかによります。 例えば、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)は不自然だと思いませんか? 要はプログラマが見て理解しやすいコードを書けばよいわけです。
お礼
ありがとうございます。 サンプルなどからコピペばっかりしていたために、 基礎部分が分かりませんでした。 結果は同じなのですね。 見易さの問題ですか、なるほど。
お礼
sub関数を造ったときのことを考えると分かりやすかったです。 値を渡すのがひとつでよくなり、 記述のし忘れが減ってデバックも簡単になりますね。 ありがとうございました。