C言語でポインタを使い、構造体メンバを指定する方法はありますが、構造体のメンバの型や入出力型が同じではないと、読み書きが難しいです。
ポインタを使わないで構造体メンバを切り替える方法があればベストですが、やはりC言語では無理でしょうか。 良い方法があればアドバイスをお願いします。
動かないソースではありますが、イメージとしては以下のようです。
typedef struct{ uint32_t a; uint8_t b; uint16_t c; }hoge_m; uint32_t hoge_func(hoge_m *hoge_para, uint8_t select){ uint32_t out; out = hoge_para->( select ); //selectのところにポインタではなく、引数を当てて切り替える。 return out; }
「構造体のメンバの型や入出力型が同じではないと、読み書きが難しいです。」とありますが、例では全部uint32_t型です。
そのあたりも含めてもう少しわかりやすく表現していただけないでしょうか?
参照すべきメンバの型はどこまでの範囲を考える必要がありますか?
・すべてunsignedな整数型
・符号付きもありうる整数型
・浮動小数点型が来るかもしれない
・ポインタも入ってくる
何がしたいのかわからない.
「ポインタを使い、構造体メンバを指定する方法」が比較として例示されていると良いと思う.
データベースは、1か所のみunsignedで、他は全て、uint8_t, uint16_t, uint32だけです。
unsignedは例外として処理すれば、無視しても良いです。
浮動小数点、ポインタはありません。
どのような状況でこのような実装が必要となったのでしょうか?
(もっと広い視点で見直せば、素直にできる方法があるかもしれません)
struct構造のdatabaseがあって、外部から1の引数でコールされれば、structのaの値を返す。引数が2であればstructのbを返す。3であればcを返すといった形です。
今は引数をswitchで分岐させ、structメンバを読んできていますが、そうすると、メンバ数分、caseをつくって返す処理になるため、同じ動作をルーチンがたくさんできてしまいます。
そこでstructメンバの値を返すルーチンを共通化したいわけです。
考えつくのは
全部 uint32_t にして、配列にする。
select で指定された配列の要素を返す
ぐらいですが、だめですか?
「メンバを選ぶ機能」なので、「メンバを選ぶ動作」は必要な気がします。
色々な型が混じっているようですが、そういう関数があったとして、戻ってくる型はどうするんです?
構造体のメモリオフセットを自力で計算すれば出来なくはないでしょうが、多分普通に構造体参照するより遥かに面倒くさいです。
C#ならば、リフレクション経由で構造体のメンバを列挙する事も可能なので、C#も検討してみてください。
既にでていますが、全部uint32_tにしてしまったらいけないのでしょうか?
struct typedef{
uint32_t a;
uint32_t b;
uint32_t c;
}hoge_m;
typedef union{
unit32_t hoge_m[3];//あまり綺麗な気がしないけど、気持ち的にはこういうことをしたいのか、と
hoge_m hoge;
} hoge_u;
とすると不都合がありますか?
問題はcoltex ARMってことです。
メモリの制限もあるので、全て32bitにしたらその分無駄になります。
色んなご意見有難うございました。
回答3件
あなたの回答
tips
プレビュー