概ね方位不定だが多分割と偏っている
スポンサーサイト
--年--月--日 (--) | 編集 |
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


C 共用体
2006年09月22日 (金) | 編集 |
訳分からなくなって参りました。
が、終わらせてきたページ数見る限り残りは20%前後といったところ。
頑張れ俺。

異なる型のデータを同一の領域で共用するデータ型、だそうだ。
構造体と何が違うのか。

union body {
 char a;
 int b;
 long c;
} dat;


といったように記述する。bodyというのが構造体におけるタグで、これはunion body型の共用体、ということを意味する。多分。
最後のdatはこれはunion body型変数datである、ということを意味する。
ここら辺は構造体と同じやね。

では何が構造体と違うのかというと、この共用体bodyはa、b、cという3つのデータの先頭アドレスを同じ位置に持ち、つまるところa、b、cのそれぞれのデータが同時に存在するのではなく、bodyという共用体変数を異なるデータタイプであるa、b、cそれぞれで共用しているという点で異なっているのである。

まさに共用体。
宣言や参照の仕方なんかは構造体と同じなんだが、こっちは共用しているということで

dat.a='A';

と記述して共用体変数datに'A'を格納しても

dat.b=100;

とすると100がが格納されて前に入っていた'A'は壊されてしまう。
厳しい話だ。

そんな世知辛い共用体を使った例題を実際に見てみよう。

void main(void)
{
 struct BYTE{
  unsigned char l,h;
 };
 union body{
  struct BYTE byte;
  unsigned short word;
 }a,b;

 printf("data? ");scanf("%x",&a.word);
 b.byte.h=a.byte.l;
 b.byte.l=a.byte.h;
 printf("%x --->%x\n",a.word,b.word);
}


もうちらっと見ただけで何やねんコレ帰れむしろ消えろって感じだが、幸い記述自体は短いので諦めずに地道に上の方から見ていこう。

struct BYTE{
 unsigned char l,h;
};


unsigned char型の変数l,hをメンバに持つstruct BYTE型を宣言。

union body {
 struct BYTE byte;
 unsigned short word;
}a,b


struct BYTE型の変数byte、unsigned short型の変数wordをメンバに持つ共用体bodyの宣言及び共用体変数a,bの宣言。
byteはBYTE型の構造体変数であり、構造体BYTEはunsigned char型の変数
l,hをメンバとして持っているので、byteをメンバに持つ共用体bodyはbyte.lとbyte.h、wordの3つのメンバを持っているということになる。多分。

最初から

union body{
 unsigned char bytel,byteh;
 unsigned short word;
}


でよくねー?と思わなくもないんだが、これだとbytelとbytehが同じ位置に取られてしまい、意味が無くなってしまうのだそうだ。

意味も何もそもそも訳分からんのだが、まあそういうことにしておこう。
うむ、無意味はよくない。悪影響よりはマシだが。

とにかく共用体の宣言&定義が終わったら

printf("data ? "); scanf("%x",&a.word);

scanfで共用体変数aの方のwordに16進数でデータを入力し、

b.byte.h=a.byte.l;
b.byte.l=a.byte.h;


今度は共用体変数bのメンバーbyteに共用体変数aのメンバーbyteの値を代入する。要するに逆になるように代入しているわけだな。a.byte.lとかa.byte.hにデータなんて入ってないじゃねえかと思うかもしれないが、これは共用体なので先程scanfで入力されたwordの値が残っているのである。
多分。ていうかそうでないと説明つかねー。

最後に

printf("%x ---> %x\n",a.word,b.word);

最初にaに入力したwordとそれを逆に格納したbのwordを表示して終わり。
bのwordなんてデータ入っていませんわよと思うかもしれないが、これは共用体なので先程入力したb.byte.hとb.byte.lの値がいい感じに熟成されて格納されているはずなのである。

union_test.jpgunion_test2.jpg
この通り

入力されたwordのデータが逆に格納されたのを表示しているのでこうなるのである。
short int型であるwordは2バイトのデータであり、unsigned char型であるbyte.l,byte.hは1バイトのデータであるからこういうことが出来るわけだ。
(2バイトのデータを1バイトのbyte.lとbyte.hの2つに分けている)

共用体だからこその利用法と言えるだろう。何に使うんだか。


さて、この逆に格納するプログラムだが、当然関数にも出来る。

union_test3.jpgunion_test4.jpg
当然出来るとか言っておいて随分苦労したが

何に使うかはともかく、関数にしてしまえばそういうときに使い易いだろうって話だな。制御系のプログラムなんかはbitだのbyteだので色々やってたみたいなのでそういうのに使うんだろうか。



さて、まとめよう。

共用体……
それは構造体とは似て非なる全く別の概念


正直よく分からん。
スポンサーサイト

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。