• ベストアンサー

構造体にする理由・利点・使用例

最近「構造体」についての学習が始まりました。テキストなどで構造体を使用したプログラム例がいくつか載っていますが、あくまで説明にとどめているので、一見見ると返って複雑になってどんなメリットがあるのかいまいちつかめません。 構造体のメリットって何でしょうか?  規模の大きいプログラムになると構造体が不可欠といわれるのでしょうか?

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

  • ベストアンサー
  • jack-a3
  • ベストアンサー率34% (212/606)
回答No.3

構造体とはいろいろな型のデータの固まりに名前を付けて管理し、扱えるようにしたものです。これはとっても便利です。 ・データを一まとめにして構造体の配列で定義し使用できる。 int a[50], b[50], c[50]; char d[50]; と定義するのでなく、 struct { int a,b,c; char d;} Data[50]; とした方が分かりやすいです。 ・上記データを別関数に引数で渡す時、 func(&a[n],&b[n],&c[n],&d[n]) とするのではなく、func(&Data[n])と書ける。 これは重要です。 もし後日メンバとしてlong eを追加することになった場合、前者では関数の引数を(渡す方も受ける方も)直す必要がありますが、 後者ではstruct Dataの定義を変えるだけで済みます。 直す場所が少なくて済むということは、直した後に確認する量や時間も少なくて済むということです。 他にも移植性を高めるためだとか、コンパイラに最適化を行わせる時の判断に使えるだとか、 外部から受信したデータをあるフォーマットに従って解釈するために使うとか、いろいろと使い道があります。

nVIDIA
質問者

お礼

一つのプロトタイプが完成したとして、新たに何らかの変更で変数を追加・変更する事となったら大変な作業となりますよね。 それを、あらかじめ一つにまとめておけばそこだけ書き換えるだけでいいですものね。 構造体が便利であるという理由が見えてきました。 どうもご回答ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

回答No.6

C言語の標準ライブラリでよく知られた構造体として、 struct tm というのがあります。 その例は、 http://www1.cts.ne.jp/~clab/hsample/Time/Time4.html にあります。 これは、C言語の標準ライブラリで、日時を扱う関数が共通して使う構造です。日時を扱う関数がすべてこのような形のデータを使うので、 ・日時を使うための新しい関数が必要 ・実際に日時の計算をしたい ・面倒な日時の計算をするために既存の関数を使う 等の場合、この構造体をベースにするとうまくいく可能性が高いわけです。 ここまで有名でなくても、自分たちのプログラムの中で、関係のあるものをひとつの構造体として定義しておくと、それに関連する関数の流通性が良くなります。 他にも、リンクドリストのようにデータを動的に(実行時に数を増やしたり減らしたりする)管理する場合、ポインタとデータのペアがどうしても必要になります。 このような場合にも、ポインタとデータ(が、また構造体だったりもしますが)のペアを構造体として定義します。 struct linkType { int data; struct linkTpye *next; }; のように。 もうひとつ、構造体は直接代入が可能です。 このため、 struct{ char address[50]; char name[50]; int age; } personA, personB; などという構造体で、 personA = personB; という代入は有効です。 おまけとして、これを使うと、 struct charArray { char [128]; }; struct charArray a; struct charArray b; で、 b = a; などと、配列の代入が出来てしまいます。 (が、この機能を使うと、おそらく他の人の迷惑になるでしょう。一見しただけでは意図がわからないから)

nVIDIA
質問者

お礼

あくまで例ですから。 先生からも他人から見てもわかりやすいように書くよう指示されてますのであしからず。 利点や重要さが見えてきた気がします。後は経験しだいですね。今後、また構造体のほかにも壁にぶつかるかもしれませんが、その時は相談をおねがいします。 今回はありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • PG_RankB
  • ベストアンサー率40% (12/30)
回答No.5

もう的確なお答えが出ているので、今更言う事は無いのですが。。。 少し質問から離れてしまいますが、お許し下さい。 プログラムの規模は、学校での勉強の時は、数十から始まり、main()の中だけで済む事も大半です。 課題が出ても、数百ステップですね。 そこで、グローバル変数では無くローカル変数。 関数で処理を小分けにする。構造体や配列でデータをまとめる。 と言われても、正直な所、メリットが感じられないのは事実だと思います。 私も今まで、ポインタ、構造体、関数。どれもこれも、新しい機能を学び始めの頃は、過去のソース、知識と見比べ、今のままで絶対に、充分だ。と思っていました。 ですが、これらの機能は、過去の偉大な方々が、必要だからこそ入れた機能で、大抵重要な意味を持っています。 プログラムの規模が大きくなれば、データをまとめるために構造体を使用する場面は増えてきます。 それは、実際に経験して肌で感じた時に、否応なしに理解する物ですので、必要ない。とないがしろにはしないでいた方が、後々のためだと思いますよ^^ 機能の真意が理解できた時、ニヤッとしますからw プロの現場では、常に数十万~数百万ステップ規模のソースの隣にいなければならなくなります。 構造体や関数、ポインタなどの機能は、単純にソースコードを短く簡潔にしてくれる作用も持っています。 場合によっては、ソースを何十分の1の大きさにする事も充分あり得ます。 jack-a3様の言うとおり、構造体のメンバに追加した時、関数のインタフェース(引数・戻り値の型や個数の事)を変更せずに済むのも大きなメリットです。 関数に引数1つ追加しただけで、数百回と別の場所で呼び出ししている所も全て変更。なんて、毎回やってたらそれだけで嫌になります。 巨大な規模のソースにのみ便利。と言う単純な話では無いのですが、今はまだ、その位の認識で良いかも知れませんね^^ 長文で申し訳無いですが、頑張ってください。

nVIDIA
質問者

お礼

ふむふむ、昔のおじさんたちは必要だから、このような機能を開発したのですよね。必要なきゃ学校じゃ習わないもの。こういうのは幼い子でもわかります。 >機能の真意が理解できた時、ニヤッとしますからw まさにそうです。なにか、私をどこかで見ている感じです(笑) どっちにしろ、避ける気はしませんので、絶対にマスターします。 そして「サーティファイC言語プロガラミング1級」を目指したいです。 どうも、いいお話ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
noname#21649
noname#21649
回答No.4

FOTRONなのでCとは多少異なるかもしれません。 複数人でソフトを作るときに変数の独立性を確保する必要があるのです。 それで「Aはoooooooを作る。大域変数としてZOで始まる変数を自由に使える。」「Bはppppppppを作る。大域変数としてZPで始まる変数を自由に使える。」と作る人によって資源(使用可能変数名・定数名等)をうまく割り振らないと.資源の奪い合いでめちゃくちゃになるのです。 大域変数でこのように割り振って.今度は.局所変数では大域変数のコピーを作るのが面倒ですから.大域変数名がそのまま生きているのです。 メモリーが比較的低価格になってきた1980年だ言い工に.かっての「メモリーを使わないプログラミング」から.「複数人間で作業を分割してお互いにわかりやすい名称にしよう」という流れに代わりました。その一環です。

nVIDIA
質問者

お礼

ソフトウェアの開発はチームで作ると最初からいわれていました。他人がそれぞれ担当したプログラムをどう一つにするのか疑問でしたが、この話からすると、どのように一つにするのか見えてくるような気がしました。 構造体の重要点はこのようなところもあるようですね。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • goma_2000
  • ベストアンサー率48% (62/129)
回答No.2

関数の引数を10個も書くの嫌でしょう。戻り値も同じだと、合わせて20個。腕が釣ったりして・・・ 構造体なら2変数ですみます。 プログラミングの基本として、関連のあるものをまとめるという事があります。その意味で、変数を管理する際に、構造体にまとめるというのは、規模が大きくなればなるほど重要ですね。混乱しないから。ってC++ならクラスを使いますけど。。。

nVIDIA
質問者

お礼

つい先日オセロゲームをつくりました。 そのときにたくさんの変数と関数を使ったからそれから考えると分かる気もします。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>構造体のメリットって何でしょうか? 関連のあるデータをまとめて扱えること 規模が大きくても使わない場合もあろうかと思いますので、 直接はプログラムの規模とは関係ないと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • テキストデータと構造体。

    テキストデータを構造体に代入し、キャッシュの仕組みの様に見せるプログラムをC言語で作れますか? 教えて下さい。ちょっと緊急です…

  • 構造体について

    凄く初歩的な質問で申し訳ありませんが… 入門書の構造体のところで 以下のようなプログラムの例がありました。 #include <stdio.h> struct seiseki { /* 構造体の宣言 */ int no; char name[20]; double average; }; int main(void) { int i; struct seiseki seito1, seito2[20]; /* 構造体変数と構造体配列の宣言 */ >char name[20] というのは、NAMEの領域を20文字 確保すると言うことですよね? >struct seiseki seito1, seito2[20] ここの箇所が分からないのですが seito2[20]の20というのは どうして20なのですか? NAMEだけではないので もっと大きな数字になるような気がするのですが… またseito1の方は どうして数字が何もないんですか? 考え違いをしているところを ご指摘して頂ければ幸いです。

  • 異なる複数の構造体のスマートな使用方法

    構造体のビットフィールドを複数作成し、 条件によってどの構造体を使用するかを決定し データ取得しようとしています。 同じ型の構造体の配列はできますが、 異なる構造体が複数ある場合、配列のように 参照する方法はないでしょうか? スマートなやり方があれば、ご教授お願い致します。 以下、やろうとしていることの簡易版、 /* ----例----------------------------------*/ int test = 1; if( test == 1){ /* 構造体test01を使用し値参照 */ } else if( test == 2){ /* 構造体test02を使用し値参照 */ } else if( ........ /* 以下同じような処理 */ struct test01{ unsigned int bit01: 1; unsigned int bit02: 15; } struct test02{ unsigned int bit01: 2; unsigned int bit02: 14; } struct test03{ unsigned int bit01: 3; unsigned int bit02: 13; } /* 同様の構造体がつづく*/ /* --------------------------------------*/

  • C言語構造体についてです。

    C言語、π=PI 3.14159265で構造体を用いてmensekiを呼び出して 半径と面積を計算して出力するプログラムです。下の空白を埋めてもらえますか? /* 構造体のプログラム */ #include <stdio.h> #include <math.h> #define PI 3.14159265 struct Data { /* 半径rと面積areaをdoubleで宣言 */ }; void menseki(struct ... 構造体のポインタを引数とする ){ /* 面積を計算する際に構造体のアドレスから計算する */ circle->area=PI* .....; } main(){ struct Data example[2]; //構造体配列 int i; /* 半径rを構造体配列を用いて2例入力する */ /* 2例の各々について mensekiを呼び出して 半径と面積を計算して出力する */ } よろしくお願いします。

  • 構造体で・・・・

    構造体は配列を使用せずメモリ領域を獲得する関数を使用すること、 *構造体内部のメンバ名には配列を用いて良い。  という、条件があるのですが場合はどのようにすればよろしいでしょうか? どなたか教えてください。 構造体は以下のようになってます。 /*構造体の定義*/ struct seiseki{   char name[20];   int eig;   int suu;   int kok;   char rank[3]; };

  • 構造体のファイル出力

    以下のような構造体を、テキストファイルに保存するにはどうしたらよいでしょうか? 構造体には、4つのデータがある場合、以下のようにします。 [構造体] typedef struct comp_bango { char bango[3]; } COMP; 出力テキスト 100 200 300 400

  • 構造体について

    分割ファイルで構造体を使うにはヘッダファイルに書くと思うのですがどうやって書けばいいのでしょうか? charやintはexternでできるのですが・・・ 例で教えてくださいm(__)m

  • 構造体について

    プログラムを勉強し始めて3日目の初心者なんですが、構造体を使う意味がいまいちよくわかりません。 たとえば、構造体の定義が { 縦の長さ 横の長さ 重さ } だとしたら、それを使うためにも { 縦の長さ= a 横の長さ= b 重さ= c } と同じものを2回書く必要があり、なんだか冗長な感じがしてしまいます。 それとも、定義で決めたデータをわかりやすく、間違えないようにするためですか? 本当に未熟で仕組みや使い方もわからない自分の質問なのですが、答えていただければうれしいです。

  • sqliteの構造体

    SQLiteを使ったメールソフトを作っています。 sqliteの構造体 sqlite3_stmt の宣言は見つかるのですが 構造体の内容の定義してあるものが見つかりません。 sqlite3.h, sqlite3.c を探したのですが見つかりませんでした。  この構造体が見つからないと そこに登録してある値が使えません。 それとも、 この構造体は定義されていなくて これを当てにしないで プログラムを組まなくてはいけないのでしょうか? 使わなくても動かせそうですか。。。 お分かりの方、よろしくお願いします。

  • 構造体のプログラム・・・・

    構造体のプログラムを作っているのですが、コンパイル時に "Fatal: ファイル 構造体1-1.OBJが開けません"と出て実行できません。 やっぱりファイル名が日本語だとダメなんですか? 他の日本語の名前のプログラムは実行できるのに・・。

このQ&Aのポイント
  • 友達に「びっくりド○キー」と「ド○キーホーテ」を同じお店だと思っていたことを間違えて答えたら笑われ、その後は友達に無視されるような感じがして心配です。
  • 友達から「ぶりっ子しないで?」と言われ、間違いを誤解されたことが原因で関係が悪くなってしまいました。
  • ド○キーホーテとびっくりド○キーを間違えたことが友達にとって不快だったのか、どう思われるのか悩んでいます。友達との関係を修復したいです。
回答を見る