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
No.1ベストアンサー
- 回答日時:
がると申します。
んっと、単純にコンパイルエラーになっている理由は
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;
};
No.3
- 回答日時:
金庫の鍵は金庫の中という状態ですので
エラーが出ます。
すなわち、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};
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++ で確認済み
hegemonism様
ソースコード付きの詳解ありがとうございます。
ソースコードのある解答は、助かります。
ところで、ポイント発行ですが、どの解答も勉強になります。
それで悩んだのですが、ポイントは先着順にさせていただきます。
ごめんなさい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# 未解決の外部シンボル _printfが関数_mainで参照されました 1 2022/09/18 15:28
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# leetcode21 1 2022/04/21 11:53
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
家・車以外で、人生で一番奮発した買い物
どんなものにお金をかけるかは人それぞれの価値観ですが、 誰もが一度は清水の舞台から飛び降りる覚悟で、ちょっと贅沢な買い物をしたことがあるはず。
-
「覚え間違い」を教えてください!
私はかなり長いこと「大団円」ということばを、たくさんの団員が祝ってくれるイメージで「大円団」だと間違えて覚えていました。
-
ちょっと先の未来クイズ第5問
日本漢字能力検定協会が主催し、12月12日に発表される、2024年の「今年の漢字」に選ばれる漢字一文字は何でしょう?
-
お風呂の温度、何℃にしてますか?
みなさん、家のお風呂って何℃で入ってますか? ぬるめのお湯にゆったり…という方もいれば、熱いのが好き!という方もいるかと思います。 我が家は平均的(?)な42℃設定なのですが、みなさんのご家庭では何℃に設定していますか?
-
バッファとは何ですか
C言語・C++・C#
-
C言語のポインターに関する警告
C言語・C++・C#
-
printf による16進表示について
C言語・C++・C#
-
-
4
gcc: incompatible pointer type
C言語・C++・C#
-
5
ポインター引数の関数でコンパイルエラーが出る。
C言語・C++・C#
-
6
別ファイルの構造体の値を読み込む、変えるには?2
C言語・C++・C#
-
7
C言語 構造体の中に共用体を定義した変数の初期化に関して
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/2】 国民的アニメ『サザエさん』が打ち切りになった理由を教えてください
- ・ちょっと先の未来クイズ第5問
- ・【お題】ヒーローの謝罪会見
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
visualstudio C# テキストボッ...
-
DLLでLIBファイルが作成されない
-
main.c:7:43: warning: implici...
-
C++のfor文について
-
【#define】 defineで定義した...
-
C++でboolにintの値を代入する...
-
void func( void )について
-
GCCで暗黙の型変換の警告を出し...
-
関数の実体定義にヘッダファイ...
-
構造体を引数とする、クラス間...
-
ハンドルされていない例外が発...
-
変数の型を定義しなかった場合...
-
inline
-
0除算を判定したい
-
クラスのファイル分割について
-
C++/CLIでネイティブの構造体を...
-
引数で argc argvが使用され...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
C++のfor文について
-
2重定義って??
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
typedef enumの使い方を教えて...
-
C++でboolにintの値を代入する...
-
プログラムの中で別のmainを呼...
-
構造体の要素すべてに対する四...
-
変数の型を定義しなかった場合...
-
intとINTの違いは?
-
main.c:7:43: warning: implici...
-
【#define】 defineで定義した...
-
構造体の宣言でエラーが出ます。
-
関数の実体定義にヘッダファイ...
-
ハンドルされていない例外が発...
-
void func( void )について
-
エラー「invalid conversion fr...
-
sshdログの意味
-
C言語での方向キー入力判定
おすすめ情報