本文へスキップ

アトメル社のAVRマイコンをつかった電子工作および無線を使った電子工作を紹介します。





ホーム >ソフト室 >AVRマイコンで始めるC言語の使い方 >構造体、共用体

AVRマイコンで始めるC言語の使い方

[1]構造体

構造体は、異なる型をひとまとめにした集まりを構造体と言います。

1.構造体の宣言方法

struct  st {
      char c;     // 文字型の変数
      int    i;    // 整数型の変数
};
c、iは構造体のメンバといいます。
宣言をしただけではメモリに領域を確保されていません。
メモリに領域を確保するには
struct st d;
とします。これでメモリに以下のように確保されます。
     メモリ
       ┏━━━━━━━━┓
       ┃ c                   ┃ 文字型
       ┣━━━━━━━━┫
       ┃   i                   ┃ 整数型(int型なので2バイト確保しています。)
       ┃------------------┃
       ┃                         ┃
       ┗━━━━━━━━┛
構造体の各メンバはd.c、d.iと書いて表します。

2.構造体の配列

構造体の配列は以下のように表します。
stは上記の宣言で使用した構造体とします。
    struct st d[3];この様にすると以下のようにメモリに配列が確保されます。

     メモリ
          ┏━━━━━━━━┓
d[0]   ┃ c                     ┃ 文字型
          ┣━━━━━━━━┫
          ┃   i                      ┃ 整数型
          ┃------------------┃
          ┃                          ┃
          ┣━━━━━━━━┫
d[1]   ┃ c                     ┃ 文字型
          ┣━━━━━━━━┫
          ┃   i                      ┃ 整数型
          ┃------------------┃
          ┃                          ┃
          ┣━━━━━━━━┫
d[2]   ┃ c                     ┃ 文字型
          ┣━━━━━━━━┫
          ┃   i                      ┃ 整数型
          ┃------------------┃
          ┃                          ┃
          ┗━━━━━━━━┛

配列の初期設定方法

以下のようにすることで値がメモリにはいります。
struct st d[3] = {
                 'A', 2,
                 'B', 3,
                 'C', 4
};

メモリには以下のように値が入ります。
     メモリ
          ┏━━━━━━━━┓
d[0]   ┃ 'A'                   ┃ 文字型
          ┣━━━━━━━━┫
          ┃   02                   ┃ 整数型
          ┃------------------┃
          ┃  00                    ┃
          ┣━━━━━━━━┫
d[1]   ┃ 'B'                   ┃ 文字型
          ┣━━━━━━━━┫
          ┃  03                    ┃ 整数型
          ┃------------------┃
          ┃ 00                     ┃
          ┣━━━━━━━━┫
d[2]   ┃ 'C'                   ┃ 文字型
          ┣━━━━━━━━┫
          ┃  03                   ┃ 整数型
          ┃------------------┃
          ┃ 00                    ┃
          ┗━━━━━━━━┛

[2]共用体

共用体の宣言は構造体ににています。
union x {
       char c;
       int    i;
};

まだ、メモリに領域が確保されていません。
union x d;
これでメモリに領域に確保されます。メモリの領域は共用体で宣言したメンバ内の最大長のデータ型となります。
ここではint型が最大ですので2バイト分メモリを確保します。
     ┏━━━━━━━━━━┳━━━━━━━━━━━┓
d   ┃                                ┃                                   ┃
     ┗━━━━━━━━━━┻━━━━━━━━━━━┛
  メンバへのアクセスは、d.c、d.iというようにします。   

[3]共用体の使われ方

構造体と共用体を組み合わせて使用して、ビットフィールドで使用します。
 構造体を使用すると、変数のデータ領域をビット単位で割り当てることができます。その構造体のメンバにビット単位で変数を定義する機能をビットフィールドと いいます。
ビットフィールドに共用体を定義すると、ビットフィールドの各値を一度にクリアすることができます。

[例]
union switch_states // スイッチ状態フラグ
{
    uint8_t BYTE;
    struct
    {
         uint8_t mode          :1; // 時計変更モード
         uint8_t mode_keep :1; // 時計変更モード確定
         uint8_t red             :1; // 赤スイッチON
         uint8_t red_keep     :1; // 赤スイッチON->OFF
         uint8_t yellow          :1; // 黄スイッチON
         uint8_t yellow_keep :1; // 黄スイッチON->OFF
         uint8_t green           :1; // 緑スイッチON
         uint8_t green_keep   :1; // 緑スイッチON->OFF
     } BIT;
};

union switch_states uSwitchState;

ビットフィールドをセット    → uSwitchState.BIT.mode = 1;
ピットフィールド全体をクリア→ uSwitchState.BYTE = 0;

前ページ次ページ