- ベストアンサー
C言語、構造体の値を比較する関数
- C言語で組み込み系ソフトを作っています。初心者です。データ(mydt)のポインタを引数で渡して関数内で1バイトずつ所定の範囲内か確認したいです。
- 構造体には型が違うものが入っているため、どのデータがサインドかアンサインドか識別しなければなりません。
- データが100個もあるため、1つずつ変数名と範囲を書いて比較するのは大変です。良い関数または構造体の記述方法があれば教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
1個1個比較するのは大変だと思いますが、それしか方法はないです。
その他の回答 (4)
- unokwave
- ベストアンサー率58% (966/1654)
質問を読み違えていました。 昔からある方法では、マクロを使って切り替える手段があります。 #if change = 1 #define A(func, type, stname, varname, opt) r = func#type(stname.varname) #define B(func, type, stname, varname) r = func#type(stname.varname) #else #define A(func, type, stname, varsname, opt) type varname#opt; define B(func, type, stname, varsname) type varname; #endif #define change 1 struct abc { A(cmp_, int, hoge, var1, [100]) B(cmp_, double, hige, var2) } #define change 2 main() { A(cmp_, int, hoge, var1, [100]) B(cmp_, double, hige, var2) } と書けば、structの中とmainの中の宣言は共通化できるので一度の手間で済みますし、後はcmp_intやcmp_doubleといった比較関数を用意するだけで済みます。
- unokwave
- ベストアンサー率58% (966/1654)
構造体のインスタンスはそのまま構造体のインスタンス名同士だけで比較できますよ。 意図的にやるなら、memcmp関数を使って比較すれば良いですね。
- wormhole
- ベストアンサー率28% (1626/5665)
>何か他の方法と言うか書き方はないのでしようか? 用意されたものはないですから自分でその方法を考えるしかないです。 1つ1つ調べるコードを書く。 オフセット位置,符号無符号フラグ,最小値,最大値の情報をデータ数(質問でいえば100)分用意し、その情報を元に調べる。 100個分のコードを書くか100個分のデータを用意するかが変わるだけで100個の呪縛からは逃れられません。
- notnot
- ベストアンサー率47% (4900/10358)
1つずつチェックするしかないですが、見通しよく書くとこんな感じでしょうか。 #define test(x,low,high) ((data->x)>=(low)&&(data->x)<=(high)) int check(struct stdata_tag *data) { return test(run_time,0,99) && test(melt_temp,-10,20) && test(cmonbaby,0,2) && ・・・・・・・・・ ; }
補足
何か他の方法と言うか書き方はないのでしようか? こう言う構造体はよくあると思うのですが?