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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- 物理学 波の合成についてです E1(z,t)=A0cos(kz-ωt+Φ) E2(z,t)=A0cos(kz 1 2022/10/10 06:35
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
(int *)の意味
-
数字列を3桁ごとにカンマで区切...
-
比較回数と交換回数表示について
-
if と配列の組み合わせ
-
C言語で三目並べをするプログラ...
-
実数の整数部,小数部の取得
-
卒業研究でよく分からないとこ...
-
C言語で分からないところがあり...
-
C言語での奇数の和
-
アスタリスクで正方形
-
警告 W8065について。
-
入力された2つの整数の差を絶対...
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
C言語
-
C言語初心者です、、、お助けく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
卒業研究でよく分からないとこ...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
std::set<int> で、ある値が何...
-
C言語 エラーの原因がわからな...
-
c言語
-
system関数がうまくいかない
-
C++でvectorにテキストファイル...
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
return 1L
-
「{ } で囲むだけ」は正しい?
-
(マルチスレッド)_beginthrea...
-
PowerShellがうまくいかない
-
このプログラミング誰か教えて...
おすすめ情報