プロが教えるわが家の防犯対策術!

typedef struct{

float x;
float y;
float z;
}Point;

typedef struct {
struct Point p1;
struct Point p2;
}Rect;

とヘッダファイルに入力しコンパイルしてみると
struct Point p1;
struct Point p2;
のPointが未定義の構造体とエラーが出ます。
どのように書けばいいのでしょう??

A 回答 (2件)

貴方は「Point型の定義」は行っていますが「Point構造体の定義」は行っていません。



例1
typedef struct{
float x;
float y;
float z;
}Point; /* ←これは構造体名ではなく、型名 */

typedef struct {
Point p1; /* 型名でメンバを定義 */
Point p2; /* 型名でメンバを定義 */
}Rect;

例2
struct tagPoint { /* ←tagPointは構造体名 */
float x;
float y;
float z;
}

typedef struct tagPoint Point; /* ←Pointは構造体名ではなく、型名 */

struct tagRect {
Point p1; /* 型名でメンバを定義 */
struct tagPoint p2; /* 構造体名でメンバを定義 */
};

typedef struct tagRect Rect;

因みに「Point」や「Rect」は、Windows GUI環境では「画面などの2Dのデバイスコンテキストの操作用に、既に定義済み」なので、別の名前を使用した方が良いでしょう。「MyPoint」や「MyRect」などのように。
    • good
    • 0

typedefしたものは、型名なので、


Point p1;
Point P2;
のように書きます。
structのタグ名を使った書き方と混同してるのでしょう。

参考:
typedef struct { float x; } a;
a p1;

struct aa { float x; };
struct aa p2;

この回答への補足

回答ありがとうございます
えと、p1,p2には.cのプログラムでxyzの関数の座標がはいるのです。
もし、ヘッダファイルの内容を.cのほうに書くと
typedef struct{

float x;
float y;
float z;
}Point;
struct Rect{
struct Point p1;
struct Point p2;
};
これをヘッダファイルに記述したいのですが、先ほど述べたとおり
struct Point p1;
struct Point p2;
のPointが未定義の構造体になるのです。
説明不足ですいません

補足日時:2008/12/06 15:50
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!