• ベストアンサー

構造体の宣言

下記のように構造体の宣言をした所、 struct B_PARAM test; 「`test' の領域サイズがわかりません」というエラーになってしまいました。この構造体を宣言し、値を入れていこうとしています。 ヘッダファイルに構造体の形は定義してあるのですが、 構造体の中に構造体があるからでしょうか? またこの構造体を正しく宣言するにはどうすればいいのでしょうか?

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

  • ベストアンサー
回答No.3

typedef struct _B_PARAM { char p1; char p2[2]; } B_PARAM; の、_B_PARAM は、構造体の「タグ名」です。 これは、sutruct とともに使う名前です(C++ struct 無しでもOK) ですから、この例では、struct _B_PARAM で正解です。 後ろの、B_PARAM は、typedef した名前です。 おおざっぱに言えば、 struct _B_PARAM { char p1; char p2[2]; } という構造体を、B_PARAM という名前で読み替えることを宣言しています。 ですから、こちらを使うのであれば、struct 無しの B_PARAM test; で正解です。 構造体は必ず typedef しなければならないというものではありません。

take_july
質問者

お礼

なるほど!ちょっと勘違いしてました。 理解できました。ありがとうございました。

その他の回答 (2)

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.2

B_PARAMの宣言が 例えば int a[] なんかになっていたりしませんか? 配列要素数が確定していないと、駄目なんですよ~ それと、使ったコンパイラを書きましょう。 このエラーだと、多分gccだとは思いますが。

take_july
質問者

補足

すいません、linuxでgccを使っています。 gcc -v とやってみたら gcc バージョン 3.2.3 20030502 (Red Hat Linux 3.2.3-20) とでました。

  • trajaa
  • ベストアンサー率22% (2662/11921)
回答No.1

B_PARAM の宣言内容はどんな感じなんでしょうか?

take_july
質問者

補足

typedef struct _B_PARAM { char p1; char p2[2]; } B_PARAM; とりあえず中の項目を絞って上のようにしても、 同じエラーが出ていたので、どうしてだろう? と思っていたのですが、 struct _B_PARAM test1; test1.p1 = 'F'; printf("%c", test1.p1); とする事で正しく扱えました。 まだ良く理解できてないのですが、{}の後につく名前と前につく名前は 何が違うのでしょうか? B_PARAM *test2; test2->p1 = 'D' ; printf("%c", test2->p1); とする事でも出力は出来ましたが、{}の前の名前は構造体用 後の名前はポインタ用とかあるのでしょうか? 追加質問で申し訳ありません。

関連するQ&A

  • 構造体の宣言方法について

    構造体の宣言で ヘッダーファイルに struct RAM rom_AAA[20] を宣言 Cソースファイル(上記のヘッダーファイルをインクルードする)に struct RAM { struct BBB *CCC } を宣言 とした時 rom_AAA[20]と*CCC(BBBアドレス)はリンクしてる状態になるのでしょうか? 構造体の一部の定数テーブルを参照するために 間単にポインタ使ってグルグル回したいのですが、同じものをアクセスしてる事にならないでしょうか?

  • 構造体と構造体型の変数宣言箇所

    はじめてborlandC++builder6でプログラムを作っているのですが、構造体と構造体型の変数宣言箇所についてわからないことがあるので質問させてください。 あるフォームのソースファイル(○○○.cpp)内の関数で、自分で定義した構造体を使う場合、ヘッダファイル(○○○.h)に構造体を定義すると、関数内で「変数が未定義」エラーになってしまいます。一方、ソースファイル(○○○.cpp)の先頭に書けばエラーになりません。  ヘッダファイルに変数定義した場合とソース内の先頭に構造体と構造体型変数を定義するのでは何が違ってくるのでしょうか?

  • 構造体のアドレス渡し

    構造体をmain()からアドレス渡しで別関数(test.cpp)に渡し、その関数の中だけでの別関数test1()にその構造体を、値渡しでもアドレス渡しでも、渡せるのでしょうか? ちなみにmain.cppと、test.cppと、myhead.hとして分割コンパイルでやりました。 /*---------main.cpp--------*/ //ヘッダファイルで構造体宣言、test()のプロトタイプ宣言済み void main() { struct data dt[10]; ・・・・・・ test(dt); //test.cppのtest関数に構造体を渡す。 } /*---------test.cpp---------*/ void test1(??????); //test1()のプロトタイプ宣言 void test(struct data *p) //構造体をアドレス渡しで受け取った { ・・・・・ test1(?????); //test.cppで宣言したtest1関数に構造体を渡したい } どうかよろしくお願いします。

  • 構造体宣言 エラー

    下記の構造体の宣言で struct table{ int hour, minute, second; }; void main(void){ table t; t = { 8,25,0}; のように書くとエラーが出てしまい、 void main(void){ table t ={ 8,25,0}; とすると問題ありません。 テキストをいろいろ読みましたが、納得できる理由を教えてください。

  • 構造体の宣言でエラーが出ます。

    c言語を勉強中の初心者です。 プログラムで、struct structB; と宣言をしたのですがエラーになります。 このように、構造体にお互いの構造体を、要素にすることはできないのでしょうか。 どうすればエラーが出なくなるのでしょうか。 どなたかご教授ください ○プログラムリスト #include <stdio.h> struct structB; struct structA { double a; struct structB b; /* エラー */ }; struct structB { int c; struct structA *d; }; int main(void) { struct structA x = {3.2, {3, NULL}}; struct structB y = {2, NULL}; printf("%lf\n", x.a); printf("%d\n", y.c); return 0; } ○実行例 C:\>cl.exe mytest.c Microsoft(R) 32-bit C/C++ Standard Compiler Version 13.10.3077 for 80x86 Copyright (C) Microsoft Corporation 1984-2002. All rights reserved. mytest.c mytest.c(7) : error C2079: 'b' が 未定義の struct 'structB' で使用しています。 mytest.c(18) : error C2078: 初期化子の数が多すぎます。 C:\> ○実行環境 Microsoft WindowsXP Professional SP2 Microsoft Visual C++ .NET Standard Version 2003

  • 構造体の入れ子が構造体の場合のextern宣言について

    えーと、題名の通りで、単に構造体の場合はextern出来たのですが、構造体の入れ子が構造体の場合は上手くextern出来ないのです;;; typedef struct __test001 { int arg; } _test001; typedef struct _body { _test001 test001; } body; body useful; この場合、他のファイル(例えばtest.cpp)でusefulを使いたい場合、どのようにexternさせれば宜しいでしょうか?

  • 構造体について

    linuxのソースコードを呼んでいる者ですが、構造体について、実際に使う方法が分かりません。 ソースコードを少し書き換えて改良したいのですが、構造体が定義されているので、それをそのまま引用しないといけないので分からなくなってしまいました。 例えば、それぞれの関数のなかで最初の変数宣言の部分にstructが付いているものもあれば、付いていないものもあります。 この差はなんなのでしょうか?

  • 構造体について

    凄く初歩的な質問で申し訳ありませんが… 入門書の構造体のところで 以下のようなプログラムの例がありました。 #include <stdio.h> struct seiseki { /* 構造体の宣言 */ int no; char name[20]; double average; }; int main(void) { int i; struct seiseki seito1, seito2[20]; /* 構造体変数と構造体配列の宣言 */ >char name[20] というのは、NAMEの領域を20文字 確保すると言うことですよね? >struct seiseki seito1, seito2[20] ここの箇所が分からないのですが seito2[20]の20というのは どうして20なのですか? NAMEだけではないので もっと大きな数字になるような気がするのですが… またseito1の方は どうして数字が何もないんですか? 考え違いをしているところを ご指摘して頂ければ幸いです。

  • 構造体について

    私は今プログラミング(C++)を勉強しているのですが、構造体に苦戦しています。分からないことがいくつかあります。もし知っていたらどれでもいいですので、よろしければ教えてください。 1、たとえば構造体を宣言するときに struct abc{ int s; struct abc xx; struct abc yy; }; と宣言するときがあります。でも上記の例と下記の例との違いが分かりません。 struct abc{ int s; struct abc xx; struct abc yy; }abc; 2、たとえばメインの最初にこのように宣言されているとします。 int j, i; struct abc *kk, *nn, *mm; これはここに宣言したものがローカルで、1のときに宣言したものがグローバルと考えていいのでしょうか? 3、メインの中に次のようなプログラムがあったとします。 kk->xx = j; kk->yy = j; nn->yy = NULL; i = kk->xx; i = kk; これらがそれぞれどのような意味があるのでしょうか。 これらでわかることがあればぜひ教えてください。よろしくお願いいたします。

  • ヘッダファイルと構造体

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

専門家に質問してみよう