次のタイプがあるとします。
typedef struct TYPEA
{
int type;
char[12] id;
} TYPEA;
typedef struct TYPEB
{
int type;
int value;
} TYPEB;
これらの型と「int」の和集合を作成して、TYPEAとTYPEBのどちらが和集合に格納されているかを知らなくても「type」intにアクセスできるようにします(intの値により、実際に格納されているものを判別できます)そこ)。しかし、正しい構文を取得できません。
私の組合:
typedef union MEMBER
{
int type;
struct TYPEA a;
struct TYPEB b;
} MEMBER;
ユニオンには、次の方法でアクセスします。
typedef struct WRAPPER
{
union MEMBER* member;
struct WRAPPER* next;
} WRAPPER;
質問:
w->member->a.id
を使用してアクセスすると、構造体または共用体ではないもので「メンバー 'id'の要求」が返されます。ありがとう。
w->member->type
。union
を具体的に割り当てる必要があります。誤解のポイントとなる可能性がある1つの注意点は、union
がint
、TYPEA
、またはTYPEB
のいずれかを保持するため、特に信頼できないことです。あなたのint type;
組合で、組合が保持しているstruct
を教えてください。
コメントの質問に回答するために編集:
あなたはおそらくこのようなものが欲しいでしょう:
struct TYPEA {
char data[30]; // or whatever
};
struct TYPEB {
double x, y; // or whatever
};
struct some_info {
int type; // set accordingly
union {
struct TYPEA a;
struct TYPEB b;
} data; // access with some_info_object.data.a or some_info_object.data.b
};
member
フィールドをポインタとして定義したので、w->member->type
の代わりにw->member.type
を使用する必要があります。malloc
する必要があります。ユニオンを割り当てると、ユニオンの最大要素に等しいsizeof
を持つ構造体が得られます。構造体をユニオンポインタにコピーしようとすると、配置が台無しになります。w->member.type
はポインタであるため、w->member->type
はw->member
である必要があります。
CがTYPEA*
またはTYPEB*
をMEMBER*
に割り当てることができるかどうかは頭の中でわかりません-どういうわけか私はそれを疑っています。いつでも(MEMBER*)
できますが、struct
sを再構成してint
タグを削除し、代わりにタグとstruct
とunion
のTYPEA
を含む1つのTYPEB
を宣言することを検討します。 struct
sは、理想的には、それらがunion
にあるという事実を考慮する必要はありません。
あなたは私の質問のコードをチェックしたいかもしれません:
基本的に、私はあなたがやりたいことをしますが、2つのタイプに共通の内部構造体(例ではcontained
)を使用しています。次に、この構造体をキャストして、両方のタイプの共通要素にアクセスできます。