プロが教えるわが家の防犯対策術!

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;

ETable2et2[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)を出力したいと思っていますが、
構造体を配列にした場合と、構造体メンバを配列にした場合は
どのように違うのでしょうか?
私には、同じように思えてしまいます。
どなたか、利点・欠点など教えていただけませんか?
よろしくお願い致します。

A 回答 (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は対の情報であると判断できますので、
前者の書き方はよくない書き方で、後者のかきかたはよい書き方となります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/11/07 11:13

ご質問の二つのプログラムについては、得られる効果は同じだと思います。


どちらが適切かというのは、そのデータが何を示しているかによります。
例えば、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)は不自然だと思いませんか?
要はプログラマが見て理解しやすいコードを書けばよいわけです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/11/07 11:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!