- ベストアンサー
異なる複数の構造体のスマートな使用方法
- 異なる複数の構造体を効率的に使用する方法について教えてください。
- 特定の条件に基づいて構造体を選択し、データを取得する方法を教えてください。
- 同じ型の構造体の配列と異なる構造体の参照方法について教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
実用的なものを作ることを目的とするなら、クラスにして適当なコンテナに入れるとか。 勉強がてらということなら、共用体にするとか。こんな感じ: http://ideone.com/eVOFA
その他の回答 (4)
- notnot
- ベストアンサー率47% (4900/10358)
質問文のようにifを使うとか、No2さんのサンプルのようにswitch/caseを使うとかして場合分けするのなら、すでに回答されているようにunionを使えば可能です。 ifやswitch/caseによる場合分けをせずに配列のようにstructの型を選択すると言うことなら、不可能です。 ビットフィールドを使わずに、自分でビットハンドリングをする関数を書くしか無い。 例えば、 void splitField(int type, unsigned short int input, unsigned int *bit01, unsigned int *bit02){ *bit01 = input >> (16-type); *bit02 = input & (unsigned short int)-1>>type; }
お礼
ありがとうございます。参考にさせていただきます。
- Tacosan
- ベストアンサー率23% (3656/15482)
同意>#1. 強いていえば struct+union だが....
こういうのはいかがでしょう?(gccで確認) [出力結果] 1, 1 3, 3 7, 7 [ソースコード] #include <stdio.h> typedef enum type { TEST01, TEST02, TEST03 } Type; typedef struct Test01 { Type test; unsigned int bit01: 1; unsigned int bit02: 15; } Test01; typedef struct Test02 { Type test; unsigned int bit01: 2; unsigned int bit02: 14; } Test02; typedef struct Test03 { Type test; unsigned int bit01: 3; unsigned int bit02: 13; } Test03; typedef struct Any { Type test; } Any; typedef union Something { Test01 test01; Test02 test02; Test03 test03; Any any; } Something; int main(int argc, char *argv[]) { int i; Test01 test01 = { TEST01, 1, 1 }; Test02 test02 = { TEST02, 3, 3 }; Test03 test03 = { TEST03, 7, 7 }; Something array[3]; array[0].test01 = test01; array[1].test02 = test02; array[2].test03 = test03; for (i = 0; i < 3; i++) { switch (array[i].any.test) { case TEST01: printf("%d, %d\n", array[i].test01.bit01, array[i].test01.bit02); break; case TEST02: printf("%d, %d\n", array[i].test02.bit01, array[i].test02.bit02); break; default: printf("%d, %d\n", array[i].test03.bit01, array[i].test03.bit02); } } return 0; }
お礼
サンプルまで記載していただき、ありがとうございます。 参考にさせていただきます。
- D-Matsu
- ベストアンサー率45% (1080/2394)
んー、質問の意図がよくわからんのですが、入力パラメータに2byte値と分解方法を示すID値があって、それによって分け方を変えるということなら「ビットフィールド構造体を使い分ける」という発想自体が無駄かと思いますが。 正直これなら関数化した方が楽でしょう。
お礼
サンプルまで記載していただき、ありがとうございます。 参考にさせていただきます。