構造体について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
つる

構造体について

#1

投稿記事 by つる » 15年前

こんばんは。
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はタグ名
とやってみたのですが、エラーでした。
これはどうしてできないのですか?

お願いします。

GPGA

Re:構造体について

#2

投稿記事 by GPGA » 15年前

構造体testを2回定義しているからです。

box

Re:構造体について

#3

投稿記事 by box » 15年前

そもそも#defineの使い道が正しくありません。
typedefを使いましょう。

Naohiro19

Re:構造体について

#4

投稿記事 by Naohiro19 » 15年前

error C2679: 二項演算子 '=' : 型 '' の右オペランドを扱う演算子が見つかりません (または変換できません)。

たかぎ

Re:構造体について

#5

投稿記事 by たかぎ » 15年前

タグ名のない構造体や共用体は、定義を行うたびに異なる型とみなされます。

紅葉

Re:構造体について

#6

投稿記事 by 紅葉 » 15年前

構造体について
構造体は似たような変数を各個体ごとに持ちたい場合に使います。
たとえばシューティングゲームで自機と敵機の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
となります。

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

閉鎖

“C言語何でも質問掲示板” へ戻る