このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン | ||
| 共用体の活用 [2011/12/06 22:00] – member | 共用体の活用 [2011/12/11 00:57] (現在) – member | ||
|---|---|---|---|
| 行 7: | 行 7: | ||
| | | ||
| あまりわかりやすくない図になってしまった気がしますが、話を進めます。構造体っていうのは、そのメンバーの変数たち全員に対して格納場所が提供されます。しかし、共用体っていのは、メンバーたちに対して格納場所は一つしか与えられません。つまり、変数たちに同居をさせているわけですね。ちなみに、同居する家は共用体のメンバーの中で一番大きいものになります。でも、格納場所が共有されているんだったら、変数aが格納されているときに、bへの値の代入なんかをするとaのデータは無くなってしまいますよね。はい、これがポイントです。だから、共用体は次のように同時に使うことのない変数達に対して使うのが普通です。共用体を使うとメモリ(データを格納する場所が減るから)が節約できるわけです。 | あまりわかりやすくない図になってしまった気がしますが、話を進めます。構造体っていうのは、そのメンバーの変数たち全員に対して格納場所が提供されます。しかし、共用体っていのは、メンバーたちに対して格納場所は一つしか与えられません。つまり、変数たちに同居をさせているわけですね。ちなみに、同居する家は共用体のメンバーの中で一番大きいものになります。でも、格納場所が共有されているんだったら、変数aが格納されているときに、bへの値の代入なんかをするとaのデータは無くなってしまいますよね。はい、これがポイントです。だから、共用体は次のように同時に使うことのない変数達に対して使うのが普通です。共用体を使うとメモリ(データを格納する場所が減るから)が節約できるわけです。 | ||
| - | | + | <code c> |
| typedef union{ | typedef union{ | ||
| - | int block; | + | char block; |
| char rot_direction; | char rot_direction; | ||
| }pass_data_t; | }pass_data_t; | ||
| - | | + | </code> |
| 上に書いたのが共用体の使用例です。文法は構造体でstructだったところをunionにするだけです。ちなみに値の参照の仕方なども構造体とまったく同じように | 上に書いたのが共用体の使用例です。文法は構造体でstructだったところをunionにするだけです。ちなみに値の参照の仕方なども構造体とまったく同じように | ||
| ”.”で区切ると使えます。この使用例ではblockとrot_directionというものを共用体として管理しています。blockは直進のブロック数、rot_directionは回転方向を表す変数です。なぜこれらを共用体にしたかというと、曲がることと、直進することは同時にできないからです。じゃあ、ブロック数と回転方向を共用体なんかにしないで別々に管理すればいいじゃないかと思うかもしれないですが、この二つのデータはどちらも経路に関するデータで、まとめておきたいわけです。まとめるだけなら、構造体を使えばいいわけですが我々がつかっているマイコンというものはパソコンのように莫大なメモリを持っておらず、メモリをケチりながら使わなければならないのです。だから、構造体にしてデータを管理するときに中の変数を同時に使う可能性がないときには共用体にすると良いわけです。 | ”.”で区切ると使えます。この使用例ではblockとrot_directionというものを共用体として管理しています。blockは直進のブロック数、rot_directionは回転方向を表す変数です。なぜこれらを共用体にしたかというと、曲がることと、直進することは同時にできないからです。じゃあ、ブロック数と回転方向を共用体なんかにしないで別々に管理すればいいじゃないかと思うかもしれないですが、この二つのデータはどちらも経路に関するデータで、まとめておきたいわけです。まとめるだけなら、構造体を使えばいいわけですが我々がつかっているマイコンというものはパソコンのように莫大なメモリを持っておらず、メモリをケチりながら使わなければならないのです。だから、構造体にしてデータを管理するときに中の変数を同時に使う可能性がないときには共用体にすると良いわけです。 | ||
| - | | ||
| | | ||