• ベストアンサー

構造体について

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

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

関連のあるデータを1個にまとめると取り扱いが楽になります 関数の引数に渡す場合も別々に複数の引数を渡すより1個の構造体で渡すとすっきり見えますし 例えば画面の座標を表すRECTという構造体を作って typedef struct tagRECT { int left; int top; int right; int bottom; } RECT; で RECT img; img.left = 10; img.top = 20; img.right = 100; img.bottom = 200; DrawBox( img ); // 4角形を書く関数のつもり とするのと別々の変数で int x1, y1, x2, y2; x1 = 10; y1 = 20; x2 = 100; y2 = 200; DrawBox( x1, y1, x2, y2); とそんなに冗長ではないと思います 例ではメンバの数が4個なので別々にしてもそれほど気になりませんが WindowsのSDKという開発環境ではメンバの数が10個以上ある構造体がごろごろしています(OPENFILENAMEという構造体は23個のメンバを持っています) これを構造体でなく全部ばらばらの変数でやったら関数1回呼び出すだけで死ねます

FooAll
質問者

お礼

構造体が本領発揮できるのはほかの関数を使うときということでしょうか。

その他の回答 (4)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.5

#1です。 どのあたりがわからないですか? 構造体であるかどうかにかかわらず、 変数に対しては定義、代入、参照のような 同種の操作を行います。 構造体に対して冗長だと感じられた点は 構造体でない変数に対しても冗長だと感じられるのでは ありませんか? というのが回答の趣旨です。

FooAll
質問者

お礼

わざわざありがとうございます。 自分の勘違いにて、冗長に感じていたようです。 いろいろと使い方を考えると、とても便利ですね。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.4

データベース的に捉えると、レコードとそのレコー ド内のデータですかね。 レコード単位で処理が必要な場合に便利です。

FooAll
質問者

補足

少しずつですが解ってきたように思います。

  • ttschool
  • ベストアンサー率28% (18/64)
回答No.2

もうちょっと、勉強を進めれば分かるはずですよ。 まずは、自分でがんばって。

FooAll
質問者

お礼

解りました。わざわざありがとうございます。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

>たとえば、構造体の定義が >{ >縦の長さ >横の長さ >重さ >} >だとしたら、それを使うためにも > >{ >縦の長さ= a >横の長さ= b >重さ= c >} >と同じものを2回書く必要があり、なんだか冗長な感じがしてしまいます。 そのお考えに従うと、 たとえば、変数の定義が 縦の長さ 横の長さ 重さ だとしたら、それを使うためにも 縦の長さ= a 横の長さ= b 重さ= c と同じものを2回書く必要があり、なんだか冗長な感じがしてしまいます。 ということにもなりませんか?

FooAll
質問者

お礼

申し訳ないですが、いまいちよく解りませんでした。

関連するQ&A

  • データ数の多い構造体配列について

    visual c++で配列をメンバーに持つ構造体配列を定義したいと思っています。 しかし、以下のように定義してもプログラムが実行されません。 配列の容量が大きいのかもしれませんが、 大量のデータを扱いたいので容量を小さくはしたくありません。 大量のデータを扱うのに何かいい方法はないでしょうか。 struct X { double A[1000]; }; : : : struct X B[10000];

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

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

  • 構造体を引数で関数へ渡す

    こんばんは。現在C言語を学んでいます。 課題という形で構造体で定義されたデータを関数の引数に当てはめ、データを渡すという処理を行わねばならぬのですが、関数を利用しての構造体の受け渡しが分からず苦戦しております。ご助言頂ければ幸いです。 分かりづらいかとは思いますが下記が私が簡単にですが作ったものとなります。 私の考えている動作プロットとしては 1. 構造体の形式を定義する。 2. 冒頭にて存在する関数を定義 3. main関数内にて構造体に名前を付けて定義し、値を入力より受付 4. do_it_hoge関数に構造体を引数として与え(ここが分からず)関数を呼び出す。 5. 関数内にて引数で受け取った &hoge.a,b,c等を表示するなどしたい。(受け取る方法が分からず) 関数を呼ぶ際にカッコ内に入れるのは構造体の名前のみで良いのでしょうか? (例: do_it_hoge(hoge); のように) また呼び出される関数側の括弧は何を記述するのでしょうか? いつもならint hogehoge, や char hoge, などと宣言しているかと思うのですが。 読みづらく、分かりにくいものかとは思いますが どうぞ宜しくご教授頂ければと思っております。 構造体を触るのが久しぶりだったのでそちらでミスがあるかもしれません。もし何か補足等必要でしたらメッセージ頂ければ返事させていただきたいと思います。 //----------------------------------------------------------------// //構造体HOGEHOGE定義 //----------------------------------------------------------------// typedef struct tagHOGEHOGE { int a,b; int c; }HOGEHOGE; void do_it_hoge();//関数定義。ここでのカッコ内の定義も不明 //----------------------------------------------------------------// // main //----------------------------------------------------------------// void main(){ HOGEHOGE hoge;//hogeをHOGEHOGE利用で定義 scanf("%d,%d",&hoge.a,&hoge.b);//カンマ区切りで代入 scanf("%d",&hoge.c);//数値をhoge.cへ do_it_hoge();//←ここが分からず } //----------------------------------------------------------------// // do_it_hoge 関数。構造体を引数で受け取りたい関数。 //----------------------------------------------------------------// void do_it_hoge(){ // ←括弧内の受け方が分からず // ここでmainで入力された &hoge.aなどを参照して表示したい // 例: printf("hogeA:%d",&hoge.a); } //----------------------------------------------------------------//

  • sqliteの構造体

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

  • 条件によって構造体のリスト構造を変えたい

    こんにちは。 C(C++)で構造体を使っているのですが、まだまだ未熟で使い方が良く分かりません。以下のことを実施したいのですが、やり方をどなたかご教授頂けませんでしょうか。よろしくお願いします。 条件によって構造体のリスト構造を変えたいのです。 例えば、 条件1の場合は 構造体a→構造体b 条件2の場合は、 構造体a→構造体c 上記のようにです。そして構造体のルートから参照先をたどっていくことで、配下の構造体の値を取得したいのです。 文法上許されないようですが、イメージとしては、 struct a aa; aa.c->b.aa ということをしたいのです。よろしくお願いします。 struct a{ char a; char b; struct c; : }; struct b{ char aa; : }; struct c{ : : };

  • FILE構造体がどのように定義されているか

    こんにちは。 C言語初心者です。 今、FILE構造体について学んでいるのですが、stdioでFALE構造体が どの用に定義されているか調べなさい、という問題がありました。 それは、どのように調べればいいのでしょうか。 また、どのように定義されているのでようか。

  • スレッドセーフな構造体の作り方

    C++でマルチスレッド環境での開発をしています。 構造体のそれぞれのデータを保護したいために、スレッドセーフな構造体を 定義したいと思っているのですが、どのようにすれば一番効率的に排他制御ができるでしょうか? typdedef struct _DATA { int i; double b; char c; } DATA; たとえば、上のような構造体であれば、それぞれの変数をガードしたいと考えています。 構造体をクラスでラップする方法も考えたのですが、今一つピンと来ません。 もし便利なライブラリがあれば、ライブラリ名と使い方などを教えて頂ければ幸いです。 どうぞよろしくお願いします。

  • 構造体から他の構造体への代入

    現在C言語で簡単なプログラミングを書いているのですが、 構造体(1)(下記参照)から、構造体(2)(下記参照)への代入の方法がわからず悩んでいます。もしよければ手を貸してください!! 標準関数などがないということはわかったので、 地道に代入を行いたいです。 イメージ・・・(data[n].b = moji[n].d;) (1)struct list_kouzou{ int a; char b[30]; char c[8]; }data[100]; (2)struct list_tai{ char d[30]; }moji[15];

  • 配列を含んだ構造体への値設定について教えて下さい。

    配列を含んだ構造体への値設定について教えて下さい。 下記のような構造体の定義があります。 typedef struct A_T { UINT64 a1; UINT32 a2; } A_t; typedef struct B_T { UINT32 b1; A_t b[8]; } B_t; 構造体B_tを関数の引数で渡し、A_tのa1とa2に値を設定したいのですが、プログラミング初心者の為、どのように作ればよいのかわかりません。 どうぞ教えて下さい。

  • C#の構造体に関して

    C#の構造体に関して C#で構造体で配列を持ちたいと思い、宣言の仕方や使い方を 勉強していますが、どうしてもコンパイルは通るもののエラーと なってしまいます。 《ソース》 単純に構造体で宣言した"a"という配列に、"ABC"という文字列を 代入したいだけですが。。。 namespace テスト環境 { struct test { public string []a; } class Program { static void Main(string[] args) { test aaa = new test(); aaa.a[0] = "ABC"; } } } 配列の初期化等は、ようやく理解したつもりではいますが、構造体 が絡むとどうしてもわかりません。 どこをどのように修正したら良いかを教えて下さい。 初歩的な質問で申し訳ありませんが、よろしくお願いします。

専門家に質問してみよう