こんにちは。
C(C++)で構造体を使っているのですが、まだまだ未熟で使い方が良く分かりません。以下のことを実施したいのですが、やり方をどなたかご教授頂けませんでしょうか。よろしくお願いします。
条件によって構造体のリスト構造を変えたいのです。
例えば、
条件1の場合は
構造体a→構造体b
条件2の場合は、
構造体a→構造体c
上記のようにです。そして構造体のルートから参照先をたどっていくことで、配下の構造体の値を取得したいのです。
文法上許されないようですが、イメージとしては、
struct a aa;
aa.c->b.aa
ということをしたいのです。よろしくお願いします。
struct a{
char a;
char b;
struct c;
:
};
struct b{
char aa;
:
};
struct c{
:
:
};
No.2ベストアンサー
- 回答日時:
一番手っ取り早いのは、構造体aの中に、構造体bと構造体cの両方のポインタを持たせておいて、使わない側にはNULLを入れるといった方法でしょうか。
struct a
{
/* .bまたは.cのNULLではない方が有効 */
struct b *b;
struct c *c;
};
他には、構造体aと構造体bの最初のフィールドの型を同じにしておいて、そこにaかbかを判別できる値を格納するようにし、構造体aと構造体bの共用体へのポインタを構造体aに持たせるといった方法です。
struct b
{
char tag; /* 'b'を格納 */
...
};
struct c
{
char tag; /* 'c'を格納 */
...
};
struct a
{
union
{
struct b;
struct c;
} *p; /* .p->b.tagが'b'なら構造体b, 'c'なら構造体c */
};
好みかもしれませんが、私なら多分前者を使います。
No.4
- 回答日時:
No2 jacta さん、No3 Tacosan さんが回答されているやり方が、おそらくわかりやすい方法でしょうけど、もうちょっと汎用的にしてみました。
# 汎用ポインタ (void*) とキャストの嵐なので、マクロを使うことに
# しました。
------------------------------------------------
/* 判定用 ENUM 値 */
enum tag_e
{
A_STRUCT,
B_STRUCT,
C_STRUCT
};
/* 構造体の定義 */
struct link_s
{
enum tag_e tag;
void *link_ptr;
};
struct a_s
{
struct link_s link;
char aa;
};
struct b_s
{
struct link_s link;
char bb;
};
struct c_s
{
struct link_s link;
char cc;
};
/* 変数定義 */
struct a_s a = { A_STRUCT };
struct b_s b = { B_STRUCT };
struct c_s c = { C_STRUCT };
/* s->t のリンクを参照するためのマクロ */
#define link( s, t ) ((struct t##_s*)(s.link.link_ptr))
/* s からリンクしている先の構造体を判定するためのマクロ */
#define link_tag( s ) (((struct link_s*)(s.link.link_ptr))->tag)
------------------------------------------------
たとえば、次のようにすることになります。
------------------------------------------------
/* 構造体の値設定およびリンク処理 */
a.aa = 'A';
if ( 条件1 )
{
b.bb = 'B';
link( a, b ) = &b;
}
else if ( 条件2 )
{
c.cc = 'C';
link( a, c ) = &c;
}
/* リンク先構造体の確認 */
if ( link_tag( a ) == B_STRUCT )
{
printf( "a->b.bb=%c\n", link( a, b )->bb );
}
else if ( link_tag( a ) == C_STRUCT )
{
printf( "a->c.cc=%c\n", link( a, c )->cc );
}
------------------------------------------------
これでうまくいく理由は、ちょっと考えてみてください。
# わからないまま使うと、あとでメンテナンスとかをするときに
# 大変なことになると思いますので。。。
No.1
- 回答日時:
何がやりたいのか、いまいち分かりません。
条件というのは、構造体の中に持っているのでしょうか?
構造体bや構造体cから先のつながり方も分かりません。
この回答への補足
ご回答ありがとうございます。
説明不足で申し訳ありません。
やりたいことは、構造体のメンバ変数の中に、
別の構造体のポインタを設定したいです。
>条件というのは、構造体の中に持っているのでしょうか?
構造体の外で条件判定しています。例えば、
<処理開始>
構造体aへの値の設定
if 条件1の場合
構造体bへ値の設定
(構造体aと構造体bにリンクを貼りたいので
構造体aのメンバ変数に構造体bのポインタを
設定したい)
else if 条件2の場合
構造体cへの値の設定
(構造体aと構造体cにリンクを貼りたいので
構造体aのメンバ変数に構造体cのポインタを
設定したい)
<構造体から値を取り出す>
・まず無条件に値が設定されている構造体aの値を取り出す。
・次の値を取り出したいが、値は構造体bと構造体cのどちらに入っているか分からない。
そこで構造体aのメンバ変数の参照先から値を取り出す。
構造体bと構造体cのメンバ変数はそれぞれ異なっているため、設定処理と取り出し処理も条件によって異なります。
※条件1と条件2の判定結果を、構造体ではなく、例えばグローバル変数などに退避しておいて、<構造体から値を取り出す>処理の中で、参照する構造体をbかcか判定すれば、構造体をリストする必要はないのかもしれませんが…
以上、まだ説明不足かもしれませんが、よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/02/15 08:30
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- 化学 8 mol/L HCl、5 mol/L HCl、水中の3つの条件下でFe(III)、Co(II)、N 1 2023/05/02 01:27
- 生物学 至急です カメレオンやカエルなど、体色変化の特徴を持つ動物の皮膚構造・構造式等がわかれば教えてくださ 1 2022/08/24 02:05
- 化学 構造式とは(ジエチルエーテル) 3 2022/11/24 11:11
- 飛行機・空港 皆さん、こんにちは! 飛行機の機体について教えてください。 飛行機は、どのような構造でなぜ長時間飛行 3 2022/10/17 14:46
- 工学 西洋の教会の鐘で巨大な鐘を揺らして鳴らすのは、物理的にどんなメリットがあるの? 9 2022/12/13 08:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
Integer変数をカラにしたいので...
-
構造体の初期化方法について
-
long型のデータをバイト型の配...
-
構造体のデータを丸ごとコピー...
-
構造体のメンバ初期化について
-
C言語 構造体の中に共用体を定...
-
整数から16進数への変換 現在c...
-
C++ 構造体の一括初期化 {0}
-
winsockのsendtoで送れるデータ型
-
関数の引数の順番の混乱を回避...
-
ユーザー定義型変数の一括初期化
-
typedefをプログラム中で解除す...
-
enum宣言と列挙変数の初期値に...
-
VB6.0の変数、関数の定義位置か...
-
構造体のパックの仕様の違いに...
-
FileTimeToSystemTime がコンパ...
-
プログラミング言語の変数と数...
-
VB.NETのStructureというのはど...
-
値が代入されてない時
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAのプログラムで、DIAG = 1# ...
-
C++ 構造体の一括初期化 {0}
-
Integer変数をカラにしたいので...
-
「#undef」と「#define」の使い...
-
VBAにてcolorindexを変数に格納...
-
long型のデータをバイト型の配...
-
構造体のデータを丸ごとコピー...
-
構造体のポインタにNULLが入らない
-
VBAの変数のデータ型を変更する...
-
異なる構造体のデータのコピー
-
ユーザー定義型変数の一括初期化
-
構造体の初期化方法について
-
typedefをプログラム中で解除す...
-
C言語 構造体の中に共用体を定...
-
charとucharの違い
-
日付チェック関数について
-
整数から16進数への変換 現在c...
-
値が代入されてない時
-
命名規則 VB 構造体
-
構造体にする理由・利点・使用例
おすすめ情報