• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:異なる複数の構造体のスマートな使用方法)

異なる複数の構造体のスマートな使用方法

このQ&Aのポイント
  • 異なる複数の構造体を効率的に使用する方法について教えてください。
  • 特定の条件に基づいて構造体を選択し、データを取得する方法を教えてください。
  • 同じ型の構造体の配列と異なる構造体の参照方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.3

実用的なものを作ることを目的とするなら、クラスにして適当なコンテナに入れるとか。 勉強がてらということなら、共用体にするとか。こんな感じ: http://ideone.com/eVOFA

shin06ag
質問者

お礼

サンプルまで記載していただき、ありがとうございます。 参考にさせていただきます。

その他の回答 (4)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.5

質問文のように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; }

shin06ag
質問者

お礼

ありがとうございます。参考にさせていただきます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

同意>#1. 強いていえば struct+union だが....

noname#208507
noname#208507
回答No.2

こういうのはいかがでしょう?(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; }

shin06ag
質問者

お礼

サンプルまで記載していただき、ありがとうございます。 参考にさせていただきます。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

んー、質問の意図がよくわからんのですが、入力パラメータに2byte値と分解方法を示すID値があって、それによって分け方を変えるということなら「ビットフィールド構造体を使い分ける」という発想自体が無駄かと思いますが。 正直これなら関数化した方が楽でしょう。

関連するQ&A