構造体、共用体、ビットフィールドを使うと変数の管理が格段楽になり、ソースが見やすくなります。C言語を使う中でぜひマスターしてほしい項目だと思います。難しいと思っている人も多いようですが、フォーマットさえわかればそれをコピペでもして、使えると思います。
まず、構造体から説明します。でも、ライントレーサーを作ったみなさんなら、H8やSHのレジスタをいじるときに . で変数を区切る表現を使ってますよね(実は共用体なんだけどまあ、気にしない)あれこそが構造体です。 構造体を使うと変数を階層化することができます。イメージとしては下のような具体例を考えるといいと思います。
米という共通の属性をもつものがあるとします。コシヒカリと、ササニシキと、ヒトメボレと、あきたこまちとでもしときましょう。この時に別々に4種の銘柄を考えるのではなく
米.コシヒカリ 米.ササニシキ 米.ヒトメボレ 米.あきたこまち
といったように米というなかの中の何かと考えるとわかりやすいですよね。
さらに同じコシヒカリでも産地が違ったりしますよね。そういう時は
コシヒカリ.新潟県 コシヒカリ.秋田県 コシヒカリ.北海道
みたいにして区別できます。ここでコシヒカリはひとつ上の階層では米でしたから、
米.コシヒカリ.新潟県 米.コシヒカリ.秋田県 米.コシヒカリ.北海道
となります。つまり、入れ子構造ですね。
構造体というのは今の例のように変数名を入れ子構造にして管理しようという概念です。さて、実際の文法をみていきましょう。ここでは詳しくはかかないので適当にこの表現を真似するなりしてください。
typedef struct{ //これが構造体の型宣言する部分 struct{ char niigataken; char akitaken; char hokkaidou; }koshihikari //koshihikariという構造体を入れ子にしている int sasanishiki; //型の違う変数もまとめて扱える float hitomebore; unsigned char akitakomachi; char komekome_club[20]; //構造体の中で配列も宣言できる。 } kome_t //kome_tが構造体の型名 kome_t kome_data_1; //ここが構造体変数の宣言 kome_t kome_data_2; kome_t kome_data_array[100] //構造体の配列も作ることができる kome_data_1.sasanisiki = 15; //構造体の変数に値を代入 kome_data_2.koshihikari.niigataken = 55; kome_data_1.komekome_club[10] = 12; //構造体の中の配列に値を代入 kome_data_array[35].koshihikari.hokkaidou //構造体の配列に値を代入 kome_data_1 = kome_data_2; //同じ型の構造体同士は値の代入ができる。
こんな感じで、使ってみてください。structの前についているtypedefはまあ、気になるんだったら調べてください。共用体、ビットフィールドについては次のページで説明します。