共用体の活用

今回は構造体に引き続き共用体の使い方を見ていきます。さて、構造体と共用体の違いってなんでしょう。共用って着いているのだから何かを共用にしているはずですよね。共用体で共用されるのはメモリの番地です。この話は、変数がどのように格納されているかという話を知らない人はピンと来ないと思います。簡単に説明すると、変数というのは値を持っているわけで、その値が保存されているところが存在するということです。共用体でまとめた変数たちは、同じ場所に保存されることになります。違う変数なのに同じ場所に格納?どういうことでしょうか。下の図のような絵で説明します。

______________________       __________________
|変数 a |変数 b |変数 c |     |変数 a or b or c  |    
|______|_______|______|     |_________________|      
構造体のイメージ                共用体のイメージ

あまりわかりやすくない図になってしまった気がしますが、話を進めます。構造体っていうのは、そのメンバーの変数たち全員に対して格納場所が提供されます。しかし、共用体っていのは、メンバーたちに対して格納場所は一つしか与えられません。つまり、変数たちに同居をさせているわけですね。ちなみに、同居する家は共用体のメンバーの中で一番大きいものになります。でも、格納場所が共有されているんだったら、変数aが格納されているときに、bへの値の代入なんかをするとaのデータは無くなってしまいますよね。はい、これがポイントです。だから、共用体は次のように同時に使うことのない変数達に対して使うのが普通です。共用体を使うとメモリ(データを格納する場所が減るから)が節約できるわけです。

  typedef union{
     char block;         //直進時のブロック数
     char rot_direction; //曲がるときの回転方向
  }pass_data_t;

上に書いたのが共用体の使用例です。文法は構造体でstructだったところをunionにするだけです。ちなみに値の参照の仕方なども構造体とまったく同じように ”.”で区切ると使えます。この使用例ではblockとrot_directionというものを共用体として管理しています。blockは直進のブロック数、rot_directionは回転方向を表す変数です。なぜこれらを共用体にしたかというと、曲がることと、直進することは同時にできないからです。じゃあ、ブロック数と回転方向を共用体なんかにしないで別々に管理すればいいじゃないかと思うかもしれないですが、この二つのデータはどちらも経路に関するデータで、まとめておきたいわけです。まとめるだけなら、構造体を使えばいいわけですが我々がつかっているマイコンというものはパソコンのように莫大なメモリを持っておらず、メモリをケチりながら使わなければならないのです。だから、構造体にしてデータを管理するときに中の変数を同時に使う可能性がないときには共用体にすると良いわけです。

/home/users/2/deca.jp-mice/web/cgi/dokuwiki/data/pages/共用体の活用.txt · 最終更新: 2011/12/11 00:57 by member
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0