ページ 11

構造体について

Posted: 2009年10月16日(金) 18:40
by つる
こんばんは。
C言語は初心者で、参考書を見ながら勉強中です。WindowsのVistaを使っています。コンパイラはBorland C++です。

参考書を見ていたら、構造体について分からなかったので質問します。

/* マクロによって構造体に名前を与える(エラー) */

#define complex struct {double re, im; }

void main()
{
    complex a, b;
    comples x, y;

    a = b;       // 正しい
    x = b;    // 正しくない
}

 このcomplexはstruct {double re, im; }に置換されますよね。そうすると、
 complex a, b;
  complex x, y;
  は、
 struct {double re, im;}a, b;
  struct {double re, im;}x, y;
 となりますよね。そこで、a = bは代入できて、x = bは代入できません。

 参考書では、データの構造が同じであれば、同一の型とみなす<構造等価性>ではなく、型に与えられた名前が
同じでなければ、同一の型とみなされない<名称等価性>とありました。なんとなく理解はできました。
構造体の型名は<struct 構造体タグ名>ですよね。つまり、構造体のタグ名が必要なのですか?
そしたら、
#define complex struct test{double re, im;}    ←testはタグ名
とやってみたのですが、エラーでした。
これはどうしてできないのですか?

お願いします。

Re:構造体について

Posted: 2009年10月16日(金) 18:52
by GPGA
構造体testを2回定義しているからです。

Re:構造体について

Posted: 2009年10月16日(金) 21:58
by box
そもそも#defineの使い道が正しくありません。
typedefを使いましょう。

Re:構造体について

Posted: 2009年10月16日(金) 22:03
by Naohiro19
error C2679: 二項演算子 '=' : 型 '' の右オペランドを扱う演算子が見つかりません (または変換できません)。

Re:構造体について

Posted: 2009年10月17日(土) 08:09
by たかぎ
タグ名のない構造体や共用体は、定義を行うたびに異なる型とみなされます。

Re:構造体について

Posted: 2009年10月18日(日) 19:48
by 紅葉
構造体について
構造体は似たような変数を各個体ごとに持ちたい場合に使います。
たとえばシューティングゲームで自機と敵機の2つのデータを持たなければいけない場合があります。
普通にやると
float play_px,play_py; // 自機の座標
float enm_px,enm_py; // 敵機の座標
これだと両方でx,yを用意してますよね?
これを
typedef struct{
 float x,y;
}CHR;
CHR Play;
CHR Enm;
と宣言してあげるだけでまとめて変数を用意することができます。
上記だとPlay.x等と書いて変数の値を変更できます。

#defineは定義文と言い、値が変わったら変更が大変な場合に使います。
#define TEST 16
これはこのソースでTESTとかくと16を意味します。
int test = TEST; //test=16
となります。

急いで書いたので文脈がおかしかったら申し訳ないです。