こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語、構造体の値を比較する関数

C言語で組み込み系ソフトを作っています。
初心者です。
下記の型違いのデータを100バイト含んだ構造体があったとします。
そのデータを1バイトずつ所定の範囲内か確認して、
範囲内ならTRUE、外ならFALSEを返す関数を作りたいです。
どうな風に記述してよいかわかりません。

イメージ的には、
 データ(mydt)のポインタを引数で渡して
 関数内で1バイトずつ所定の範囲内か確認したいです。
データが100個もあるので1個1個変数名と範囲を書いて比較するのは大変です。
ややこしいのが、構造体に型が違うものが入っているので何バイト目のデータが
サインドなのかアンサインドなのか識別しないといけないです。

何か良い関数もしくは構造体の記述方法があればお願いします。

//-記-
//構造体
struct stdata_tag{
uint8_trun_time;// 0バイト目 運転時間 0~99
int8_tmelt_temp;// 1バイト目 融解温度 -10~20
uint8_tcmonbaby;// 2バイト目 家紋赤子 0~2
int8_tcold_temp;// 3バイト目 高温温度 -50~10
:
:
uint8_tdamage;//99バイト目 ダメージ 1~255
}

//構造体実態を確保
struct stdata_tagmydt;

投稿日時 - 2019-03-18 11:35:11

QNo.9598096

困ってます

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

1個1個比較するのは大変だと思いますが、それしか方法はないです。

投稿日時 - 2019-03-18 19:53:03

補足

何か他の方法と言うか書き方はないのでしようか? こう言う構造体はよくあると思うのですが?

投稿日時 - 2019-03-18 22:18:22

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

質問を読み違えていました。
昔からある方法では、マクロを使って切り替える手段があります。
#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といった比較関数を用意するだけで済みます。

投稿日時 - 2019-03-21 17:37:32

ANo.4

構造体のインスタンスはそのまま構造体のインスタンス名同士だけで比較できますよ。
意図的にやるなら、memcmp関数を使って比較すれば良いですね。

投稿日時 - 2019-03-21 17:13:51

ANo.3

>何か他の方法と言うか書き方はないのでしようか? 

用意されたものはないですから自分でその方法を考えるしかないです。
1つ1つ調べるコードを書く。
オフセット位置,符号無符号フラグ,最小値,最大値の情報をデータ数(質問でいえば100)分用意し、その情報を元に調べる。
100個分のコードを書くか100個分のデータを用意するかが変わるだけで100個の呪縛からは逃れられません。

投稿日時 - 2019-03-19 03:19:15

ANo.2

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) &&
・・・・・・・・・
;
}

投稿日時 - 2019-03-18 23:55:46

あなたにオススメの質問