• ベストアンサー

ヘッダファイルと構造体

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が未定義の構造体とエラーが出ます。 どのように書けばいいのでしょう??

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.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」などのように。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4847/10260)
回答No.1

typedefしたものは、型名なので、 Point p1; Point P2; のように書きます。 structのタグ名を使った書き方と混同してるのでしょう。 参考: typedef struct { float x; } a; a p1; struct aa { float x; }; struct aa p2;

doora88
質問者

補足

回答ありがとうございます えと、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が未定義の構造体になるのです。 説明不足ですいません

関連するQ&A

  • 関数から構造体を返す一般的な手法は

    たとえば下のような平面上の点を表す構造体があって、 typedef struct { const int x; const int y; } Point; 2点間の中心を計算する関数を書くとします。 この場合、計算結果をどのように返せばよいでしょうか。 「ただ動けばよい」コードを書くことはできるのですが、 私が知りたいのは、どのような書き方が一般的かということです。 構造体の要素が const なので、 下のコードはコンパイルできません。 void center(Point* result, Point* p1, Point* p2) {  result->x = (p1->x + p2->x) / 2;  result->y = (p1->y + p2->y) / 2; } 新しいオブジェクトを作ってコピーする? void center(Point* result, Point* p1, Point* p2) {  Point p = { (p1->x + p2->x) / 2, (p1->y + p2->y) / 2 };  memcpy(result, &p, sizeof(Point)); } この例のような小さい構造体であれば、 オブジェクトをまるごとリターンしてもよい? Point center(Point* p1, Point* p2) {  Point p = { (p1->x + p2->x) / 2, (p1->y + p2->y) / 2 };  return p; } あるいは、そもそも構造体の要素を const にする手法は C言語では一般的でないのでしょうか? どうかご教授願います。

  • 複数のライブラリをリンクするときに構造体が衝突する

    C++,開発環境はVisual Studio Professional 2013です, ライブラリ1にxy座標の構造体 struct point { int x; int y; }; を定義しています. ライブラリ2にも全く同じ構造体を定義しています. ここで,あるプロジェクトからこれら2つのライブラリをリンクしようとしたら, error C2011: 'point' : 'struct' 型の再定義 というコンパイルエラーが出ます. ライブラリ1とライブラリ2にpoint構造体が記述された共通用のヘッダを参照させるという方法をとれば解決できるのでしょうが,この方法以外でこのエラーをなんとか回避する方法はないでしょうか. 構造体宣言は只の宣言であって実体をもたないため,中身が同じであればいくら記述が重複しても問題はないと聞いたことがあったので大丈夫だと思っていました. また,ライブラリ1とライブラリ2のpoint構造体の名前それぞれpoint1,point2にするなど違うものにするという方法でも回避できるのでしょうが,下記のメインコード内でコメントアウトされている部分のように,構造体の中身が全く同じなので互換性を持たせられるようにしたいのです. ちなみに,ライブラリ1,2はコンソールアプリケーション・空のプロジェクトで作成したあと,ソリューションのプロパティで「構成の種類」を「スタティックライブラリ(.lib)」にするという手順で作成しています. 以下,簡略コード ====ライブラリ1==== ----lib1.h---- #ifndef _H1_ #define _H1_ struct point { int x; int y; }; void print_lib1(struct point p); #endif ----lib1.cpp---- #include "lib1.h" #include <iostream> void print_lib1(struct point p) { std::cout << "lib1 : " << p.x << ", " << p.y << std::endl; } =====ライブラリ2====== ----lib2.h---- #ifndef _H2_ #define _H2_ struct point { int x; int y; }; void print_lib2(struct point p); #endif ----lib2.cpp---- #include "lib2.h" #include <iostream> void print_lib2(struct point p) { std::cout << "lib2 : " << p.x << ", " << p.y << std::endl; } ===メインコード=== ----main.cpp---- #include "../../lib1/lib1/lib1.h" #include "../../lib2/lib2/lib2.h" int main(void) { struct point val; val.x = 2; val.y = 3; print_lib1(val); //print_lib2(val); }

  • 構造体の中の構造体

    typedef struct number{ int x; struct number *next; }Num; 初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか? typedef struct number{ int x; int y; }Num; の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・

  • BLOCK構造体とFORTRAN

    fortranでプログラムを組むことになったのですが、これまでプログラムを組んだことがなかったので困っています。 gridgenで作成した.grdファイルをfortranで読み込ませることがうまくできません。 原因は、.grdのフォーマットがBLOCK構造体であるからだと考えています。 POINT構造体なら読み込めることが分かっているのですが…。 そこで質問です。 BLOCK構造体である「.grd」ファイルを読み込み、POINT構造体の「.dat」ファイルを出力するプログラムをfortranで組むにはどうしたらいいですか? BLOCK構造体とは以下の形式。 X1 X2 X3 X4 X5 …Xn Y1 Y2 Y3 Y4 Y5 … Yn Z1 Z2 Z3 Z4 Z5 … Zn POINT構造体は以下。 X1 Y1 Z1 X2 Y2 Z2 X3 Y3 Z3 X4 Y4 Z4 X5 Y5 Z5 … … … Xn Yn Zn

  • 構造体の要素すべてに対する四則演算の方法を教えてください.

    構造体の要素すべてに対する四則演算の方法を教えてください. たとえば、 2点a,bの座標成分x,y,zをそれぞれの座標ごとに足す方法を教えてください. 下のようにx,y,z成分を持ったa,bがあります。 struct point{ int x; int y; int z; }; struct point a; struct point b; struct point c; この場合, c=a+b; と書くことができず, それぞれの成分ごとに以下のように足さなくてはなりません. c.x=a.x+b.x; c.y=a.y+b.y; c.z=a.z+b.z; この方法でできるのですが, 非常に効率的でないのでなにかもっと簡単に記述する方法を教えてください. お願いいたします.

  • 構造体・ビットフィールドのvolatileに関して。

    以下のような構造体があったとする。 -(1) -----------------------------  typedef volatile struct ABC{    char x;    char y;  }stABC; -(2) -----------------------------   typedef struct ABC{    volatile char x;    volatile char y;  }stABC; --------------------------------- ■質問  -------------   stABC abc;   abc.x // ←volatileは有効?   abc.y // ←volatileは有効?  ------------- ・このとき、メンバx,y は(1)/(2)の構造体型宣言どちらでも  同じ意味合いになっているのでしょうか。  ※特に(1)の場合、volatileは有効になっているのでしょうか。 ・ビットフィールド時も同じと考えて問題ないでしょうか。   (1)typedef volatile struct ABC{      char x: 1 ;      char x: 7 ;    }stABC;   (2)typedef struct ABC{      volatile char x: 1 ;      volatile char x: 7 ;    }stABC;

  • 構造体

    プログラミングの授業で構造体を習ったのですが、課題がよく分からないので質問させていただきます。その課題ですが、 複素数を表す構造体を、 struct complex{float r;(実部)float i;(虚部)}; の形で定義したとして、2つの複素数を入力し、その2つの絶対値の2乗、和、差、積、商を求めるプログラムを作るというものです。 ただし、条件として、 複素数を入力する関数void inputComp(struct complex*c)、複素数をa+biのような形に表示する関数void printComp(struct complex*c)、複素数の絶対値の2乗を関数値として返す関数float asqrComp(struct complex*c)を作成せよというのがあって困っています。 条件がなければprintfを多用してできないこともないでしょうが、条件を満たすプログラムを教えてください。

  • ヘッダファイルとは?

    ヘッダファイルを作って、そこに構造体を送りたいのですが、 「引数宣言は 'data' で始められない」というエラーがヘッダファイル側で起きてしまいます。 main()で作ったからいけないのでしょうか? 分かる方教えていただけませんか? #include<stdio.h> #include "Max_Score.h" /*構造体の宣言*/ typedef struct data{ ・・・・・; }DATA; void main(){ DATA data[50]; ・・・・・・・・; Max_Score(data); } /*Max_Score()側*/ void Max_Score(data *p){ ・・・・・; }

  • 構造体メンバへの代入

    とても初歩的なことなのですが、 typedef struct _X{ int x; }X[50]; と構造体を定義して X[0].x = 0; と0を代入しようとすると、「宣言が正しく終了していない」とエラーが出てしまいます。 これはなぜでしょうか? ちなみにMicrosoft Visual C++ 2005 Express Editionを使っています。

  • 構造体のメンバーの静的なサイズ取得

    構造体のメンバーをヘッダーファイル中で得たい場合、 以下のような方法以外になにか方法はないでしょうか? 単純に XXXX x;と宣言してそれを sizeof(x.chwk)と 使うというような方法以外で なにかあれば教えてください。 ---------------------------------------- typedef struct { char chwk[100]; } XXXX; typedef struct { char chwk[ sizeof(( (XXXX*)0)->chwk ) ]; } YYYY; main(int arc, char *arg[] ){ YYYY y; printf( " YYYY chwk size = %d\n", sizeof(y.chwk)); }

専門家に質問してみよう