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)を出力したいと思っていますが、
構造体を配列にした場合と、構造体メンバを配列にした場合は
どのように違うのでしょうか?
私には、同じように思えてしまいます。
どなたか、利点・欠点など教えていただけませんか?
よろしくお願い致します。
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は対の情報であると判断できますので、
前者の書き方はよくない書き方で、後者のかきかたはよい書き方となります。
sub関数を造ったときのことを考えると分かりやすかったです。
値を渡すのがひとつでよくなり、
記述のし忘れが減ってデバックも簡単になりますね。
ありがとうございました。
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)は不自然だと思いませんか?
要はプログラマが見て理解しやすいコードを書けばよいわけです。
ありがとうございます。
サンプルなどからコピペばっかりしていたために、
基礎部分が分かりませんでした。
結果は同じなのですね。
見易さの問題ですか、なるほど。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
複数桁10進数の*桁目だけを抽出...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
(int *)の意味
-
return 1L
-
std::set<int> で、ある値が何...
-
【C++】関数ポインタの使い方
-
int型の変数値をバイト列として...
-
PowerShellがうまくいかない
-
system関数がうまくいかない
-
ファイルから読みこむ方法
-
C言語で三目並べをするプログラ...
-
ラップ関数とはどんなものですか?
-
実数の整数部,小数部の取得
-
C言語で分からないところがあり...
-
if と配列の組み合わせ
-
乱数について教えてください!
-
構造体の勉強中です 合計点の高...
-
メルセンヌ・ツイスタの乱数生...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
AtCoderABC135の問題Cについて
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
ラップ関数とはどんなものですか?
-
if と配列の組み合わせ
-
return 1L
-
read関数をノンブロッキングで...
-
(int *)の意味
-
std::set<int> で、ある値が何...
-
Win32APIで作るコンボボックス...
-
C++でvectorにテキストファイル...
-
「{ } で囲むだけ」は正しい?
-
足して100になるような乱数のア...
-
Arduinoのプログラムにエラーが...
-
課題でつまってます・・・
おすすめ情報