some_type
ユニオンとして定義できます。
typedef union{
struct structA_t;
struct structB_t;
struct structC_t;
}some_type;
これにより、配列のどの要素に実際に何が含まれているかがわからないという問題が発生します。
これを克服するには、使用するコンテンツを指定する別のフィールドを追加します。
/* numbers to identify the type of the valid some_type element */
typedef enum my_e_dataId{
dataid_invalid = 0,
dataid_a,
dataid_b,
dataid_c
} my_dataId;
typedef union u_data {
struct structA_t* a;
struct structB_t* b;
struct structC_t* c;
}mydata;
typedef struct s_some_type{
my_dataId dataId;
mydata myData;
}some_type;
次に、次のように配列を初期化できます。
some_type sta[] = {
{dataid_a, (struct structA_t*) &a},
{dataid_b, (struct structA_t*) &b},
{dataid_c, (struct structA_t*) &c}
};
の要素をループするときはarray
、最初に評価dataId
して、に何が含まれているかを確認しますmyData
。次に、たとえば、を使用して最初の要素のデータにアクセスします
sta[0].myData.a->FIELDNAME_OF_A_TO_ACCESS
または3番目の要素
sta[2].myData.c->FIELDNAME_OF_C_TO_ACCESS
実用的な例については、このideoneを参照してください:http://ideone.com/fcjuR