お風呂の温度、何℃にしてますか?

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

A 回答 (3件)

がると申します。


んっと、単純にコンパイルエラーになっている理由は
struct structA {
double a;
struct structB b; /* エラー */
};



struct structA {
double a;
struct structB *b; /* ポインタ型に修正 */
};

すればなおります。

で。
「構造体にお互いの構造体を、要素にすることは」、これは絶対に出来ないです。なぜなら、その構造体のサイズ解決で永久ループになるためです。
質問者さんが実際にされているのは「構造体にお互いの構造体"へのポインタ"を、要素にすることは」、これは可能です。
言葉としては微妙な違いですが中身はかなりでかく違うので、気にされるとよいかもしれません。

あと、今回のプログラムの構造体であれば、unionを使うのも手です。
struct structAB {
union {
double a;
int c;
} data;
struct structAB *ab;
};
    • good
    • 0
この回答へのお礼

galluda様
詳しい解答ありがとうございます。
「構造体のサイズ解決で永久ループになる」は勉強になりました。

お礼日時:2005/12/29 23:24

金庫の鍵は金庫の中という状態ですので


エラーが出ます。
すなわち、structBが定義されていないのに,使用しているからです。

#include <iostream>

typedef struct _tagstructA{
double a;
void *b;
} structA;

typedef struct _tagstructB{
int c;
void *a;
} structB;

typedef struct _tagstructC{
structA *a;
structB *b;
} structC;


int main()
{
char sample[] = "SAMPLE STRINGS.";
structB y = {2, NULL};
structA x = {3.2, (char *)sample};
structC z = {&x, &y};
// print
std::cout << "structC z.a->a = [" << z.a->a << "], z.a->b = [" << (char *)z.a->b << "]" << std::endl;
std::cout << "structA z.b->c = [" << z.b->c << "], z.b->a = [" << z.b->a << "]" << std::endl;
}
結果
structC z.a->a = [3.2], z.a->b = [SAMPLE STRINGS.]
structA z.b->c = [2], z.b->a = [0x0]

GNU C++ で確認済み
    • good
    • 0
この回答へのお礼

hegemonism様
ソースコード付きの詳解ありがとうございます。
ソースコードのある解答は、助かります。
ところで、ポイント発行ですが、どの解答も勉強になります。
それで悩んだのですが、ポイントは先着順にさせていただきます。
ごめんなさい。

お礼日時:2005/12/29 23:26

struct structA;



struct structB {
int c;
struct structA *d;
};

struct structA {
double a;
struct structB b;
};

としてください。
構造体の容量が決まっていない段階で、実態は使えません。ポインタでしたら容量は決まっていますので、宣言さえしておけばよいです。
    • good
    • 0
この回答へのお礼

mocomoco_0001様
ポイントを抑えた簡潔な解答ありがとうございます。
わかりやすい解答で勉強になります。

お礼日時:2005/12/29 23:25

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

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報