[union]共用体を駆使するスレ[union]

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
俺は使わないけど。
なんに使って良いのか、全然解んないけど。
2デフォルトの名無しさん:05/02/20 13:19:52
こっちできいて
http://www.seinen-u.org/
3デフォルトの名無しさん:05/02/20 13:23:36
>>1
俺は使うけど。
無駄をなくすのに使っていいのか、全然解んないけど。
4デフォルトの名無しさん:05/02/20 13:26:51
strict aliasing
5デフォルトの名無しさん:05/02/20 13:44:35
一々スレを立てずに既存の質問スレをご利用ください。

すれ立てるまでもない質問はここで 第65刷
http://pc5.2ch.net/test/read.cgi/tech/1108815602/
6デフォルトの名無しさん:05/02/20 14:16:06
                                 )
                            _      ノ   出席番号8番
                  _,, ---- 、_  | | />  ⌒`'⌒ヽ パイパンの
              _,,-ァ''"       ヽ、| レ'∠_,       )  神楽坂明日菜様が
            / /⌒"''ー 、  " 「 ⌒ ヽ、/)、      ⌒ヽ       >>8ゲット!
         ___/       ヽ ヽ、  {   , 勹 `、ヽ        )
       ,ン''フ  {~   ⌒ヽ、   ヽ、`ヽ\/ ノ 、、 \\      ⌒Y⌒Y⌒
     、/ /   { ヽヽ、 ヽ、 \ ヽ、 ヽ、`ヽ i i トー 、ニニニ`、_
    / \/ / i ハ ヽ、 ヽ、、ヽ、 >、>、 ヽ`ヽ、  l\ \\`ー 、二二_ー‐‐‐‐‐‐‐‐‐
   / iニニ/ i  | | ヽ ヽ`ヽミ >へ、,,_ヽ、ヽYヽヽ }  ヽ ヽ \::..  \ ̄ ̄ ̄ ̄ ̄
  ./    l イ|  ト|   \ヽ / >イ)⌒ト`l |ヽ))) |     ヽ \ \::..  \    /
  /     |.l ハ  | |、_,,,,,,__ \    ヽ、, 〉 l レノ/      \ ヽ \::::....  ヽ、/::::::::
 /      |l ~ヽ .トイ、 i个、     ///  レ 「ヽl    _,,-‐ヽ、 `ー、 ヽ、::::::..... `"''
 {      !.   トヾ、ヽヽヽ)i   , -、      》⌒>' /   ヽ、、 二二ニニニニニニニ
          | ト、!ト`ヽ  ` < ィ  )  / 〃/  / __________\_/::::::::\:::::::::::::::::::
           | ト\ヽ \,_  `ヽン ,イ// /  i |     ,,,,---ヽ :::::::;`> 、;;;;;;;;
             | ハヽ `ヽ\`二ニ='ツク ,/./   ハ l  (二"      `ヽ<
           |l ヽ_` (三三三ニア/  |   i  |     ̄"""'''''''''----`----、
         /ニニニニニニ===ー''ァ彡ソ、   ノ    i       ___,,,,-----
                 _,-ァ/'''/,イ ヽ<ー'''''""コ ヽ
              ///,, -'7 {    |彡へ .}  ヽ、::::::::::::....
7デフォルトの名無しさん:05/02/20 14:24:00
昔の事じゃがのぉ、記憶域がたりんで、ビットフィールドとunion使いまくったで。
8デフォルトの名無しさん:05/02/20 14:29:08
                                 )
                            _      ノ   出席番号8番
                  _,, ---- 、_  | | />  ⌒`'⌒ヽ パイパンの
              _,,-ァ''"       ヽ、| レ'∠_,       )  神楽坂明日菜様が
            / /⌒"''ー 、  " 「 ⌒ ヽ、/)、      ⌒ヽ       >>8ゲット!
         ___/       ヽ ヽ、  {   , 勹 `、ヽ        )
       ,ン''フ  {~   ⌒ヽ、   ヽ、`ヽ\/ ノ 、、 \\      ⌒Y⌒Y⌒
     、/ /   { ヽヽ、 ヽ、 \ ヽ、 ヽ、`ヽ i i トー 、ニニニ`、_
    / \/ / i ハ ヽ、 ヽ、、ヽ、 >、>、 ヽ`ヽ、  l\ \\`ー 、二二_ー‐‐‐‐‐‐‐‐‐
   / iニニ/ i  | | ヽ ヽ`ヽミ >へ、,,_ヽ、ヽYヽヽ }  ヽ ヽ \::..  \ ̄ ̄ ̄ ̄ ̄
  ./    l イ|  ト|   \ヽ / >イ)⌒ト`l |ヽ))) |     ヽ \ \::..  \    /
  /     |.l ハ  | |、_,,,,,,__ \    ヽ、, 〉 l レノ/      \ ヽ \::::....  ヽ、/::::::::
 /      |l ~ヽ .トイ、 i个、     ///  レ 「ヽl    _,,-‐ヽ、 `ー、 ヽ、::::::..... `"''
 {      !.   トヾ、ヽヽヽ)i   , -、      》⌒>' /   ヽ、、 二二ニニニニニニニ
          | ト、!ト`ヽ  ` < ィ  )  / 〃/  / __________\_/::::::::\:::::::::::::::::::
           | ト\ヽ \,_  `ヽン ,イ// /  i |     ,,,,---ヽ :::::::;`> 、;;;;;;;;
             | ハヽ `ヽ\`二ニ='ツク ,/./   ハ l  (二"      `ヽ<
           |l ヽ_` (三三三ニア/  |   i  |     ̄"""'''''''''----`----、
         /ニニニニニニ===ー''ァ彡ソ、   ノ    i       ___,,,,-----
                 _,-ァ/'''/,イ ヽ<ー'''''""コ ヽ
              ///,, -'7 {    |彡へ .}  ヽ、::::::::::::....
9デフォルトの名無しさん:05/02/20 14:38:07
言語処理系を作る奴は union を使いまくる。
10デフォルトの名無しさん:05/02/20 14:42:07
                                 )
                            _      ノ   出席番号8番
                  _,, ---- 、_  | | />  ⌒`'⌒ヽ パイパンの
              _,,-ァ''"       ヽ、| レ'∠_,       )  神楽坂明日菜様が
            / /⌒"''ー 、  " 「 ⌒ ヽ、/)、      ⌒ヽ       >>8ゲット!
         ___/       ヽ ヽ、  {   , 勹 `、ヽ        )
       ,ン''フ  {~   ⌒ヽ、   ヽ、`ヽ\/ ノ 、、 \\      ⌒Y⌒Y⌒
     、/ /   { ヽヽ、 ヽ、 \ ヽ、 ヽ、`ヽ i i トー 、ニニニ`、_
    / \/ / i ハ ヽ、 ヽ、、ヽ、 >、>、 ヽ`ヽ、  l\ \\`ー 、二二_ー‐‐‐‐‐‐‐‐‐
   / iニニ/ i  | | ヽ ヽ`ヽミ >へ、,,_ヽ、ヽYヽヽ }  ヽ ヽ \::..  \ ̄ ̄ ̄ ̄ ̄
  ./    l イ|  ト|   \ヽ / >イ)⌒ト`l |ヽ))) |     ヽ \ \::..  \    /
  /     |.l ハ  | |、_,,,,,,__ \    ヽ、, 〉 l レノ/      \ ヽ \::::....  ヽ、/::::::::
 /      |l ~ヽ .トイ、 i个、     ///  レ 「ヽl    _,,-‐ヽ、 `ー、 ヽ、::::::..... `"''
 {      !.   トヾ、ヽヽヽ)i   , -、      》⌒>' /   ヽ、、 二二ニニニニニニニ
          | ト、!ト`ヽ  ` < ィ  )  / 〃/  / __________\_/::::::::\:::::::::::::::::::
           | ト\ヽ \,_  `ヽン ,イ// /  i |     ,,,,---ヽ :::::::;`> 、;;;;;;;;
             | ハヽ `ヽ\`二ニ='ツク ,/./   ハ l  (二"      `ヽ<
           |l ヽ_` (三三三ニア/  |   i  |     ̄"""'''''''''----`----、
         /ニニニニニニ===ー''ァ彡ソ、   ノ    i       ___,,,,-----
                 _,-ァ/'''/,イ ヽ<ー'''''""コ ヽ
              ///,, -'7 {    |彡へ .}  ヽ、::::::::::::....
11デフォルトの名無しさん:05/02/20 14:43:56
union{
int WindowsActivationDisablizer;
int AccessHereToWarez;
} YattaIkematen;

文法これで合ってるかな・・・
12デフォルトの名無しさん:05/02/20 14:46:58
アラインメントを保証するために使ったりとか
エンディアンを確認するためとか
13デフォルトの名無しさん:05/02/20 15:07:31
アライグマを保護するために使ったりとか
インディアンを確保するためとか
14デフォルトの名無しさん:05/02/20 18:52:32
共用体なんてのが意味を持ってたのはメモリが少なかった昔の話。
メモリがふんだんに使える今、あえて使う理由などない。
かえってバグの原因になる。
15デフォルトの名無しさん:05/02/21 00:33:30
一度も使ったこと無いや。
良いことなのか悪いことなのか、幸福なのか不幸なのか、その辺知らんけど。
16デフォルトの名無しさん:05/02/21 00:53:16
クラス継承のお陰で不要になった
17デフォルトの名無しさん:05/02/21 02:31:55
struct hoge {
 int type
 union {
  ...
 } u;
};
こんな感じのコードを昔はよく書いたな。
18デフォルトの名無しさん:05/02/21 03:08:05
type のところとかどうせ利用側で
switch 使いまくらないといけないのが結局無駄
19デフォルトの名無しさん:05/02/21 03:10:06
インテルのCPUからプロセッサ情報
取得する時はunion使うよね
文字列を逆にしないといけないが。
20デフォルトの名無しさん:05/02/21 23:05:12
>>17
これが正しい文法だ。
今後のWindowsではなw

[StructLayout(LayoutKind.Explicit)]
public struct YattaIkematen
{
  [FieldOffset(0)]public int WindowsActivationDisablizer;
  [FieldOffset(0)]public int AccessHereToWarez;
}
21デフォルトの名無しさん:05/02/21 23:06:26
>>11へのアンカーミスorz
22デフォルトの名無しさん:05/02/22 08:47:13
共用体を使うとメモリの節約になるのって
どんなとき?

そんなケース、想定できないんだけど
23デフォルトの名無しさん:05/02/22 09:10:00
bison使うと嫌でもunion漬け
24デフォルトの名無しさん:05/02/22 10:21:58
struct st_itu0 {          /* struct ITU0 */
     union {         /* TCR    */
      unsigned char BYTE;    /* Byte Access */
      struct {        /* Bit Access */
        unsigned char wk :1;   /*    */
        unsigned char CCLR:2;   /*  CCLR   */
        unsigned char CKEG:2;   /*  CKEG   */
        unsigned char TPSC:3;   /*  TPSC   */
       }  BIT;     /*    */
      }   TCR;     /*    */
     union {         /* TIOR   */
      unsigned char BYTE;    /* Byte Access */
      struct {        /* Bit Access */
        unsigned char wk :1;  /*    */
        unsigned char IOB:3;  /*  IOB   */
        unsigned char   :1;  /*    */
        unsigned char IOA:3;  /*  IOA   */
       }  BIT;     /*    */
      }   TIOR;      /*    */
     union {         /* TIER   */
25デフォルトの名無しさん:05/02/22 12:07:50
>>22
union をメモリ節約のために使うなぞ、莫迦のする事。
じゃあなんの為に使うのかというと……正直、使い道なんかない。
複数の構造体を並べて、その最大サイズでメモリに割り付けられるくらい。

>>17
Xlib には、そーゆーのが現存する。
tp://xjman.dsl.gr.jp/X11R6/X11/CH10.html
26デフォルトの名無しさん:05/02/22 13:05:36
複数のメンバのうち、同時に二個以上持つことが無い場合なんかに(名前で明確に区別できて)有用じゃない?
27デフォルトの名無しさん:05/02/22 21:08:22
struct WORDREGS { struct BYTEREGS {
unsigned int ax; unsigned char al, ah;
unsigned int bx; unsigned char bl, bh;
unsigned int cx; unsigned char cl, ch;
unsigned int dx; unsigned char dl, dh;
unsigned int si; };
unsigned int di;
unsigned int cflag;
};
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
28デフォルトの名無しさん:05/02/22 21:10:02
こう言う使い方するためにある

struct WORDREGS {
unsigned int ax;
unsigned int bx;
unsigned int cx;
unsigned int dx;
unsigned int si;
unsigned int di;
unsigned int cflag;
};

struct BYTEREGS {
unsigned char al, ah;
unsigned char bl, bh;
unsigned char cl, ch;
unsigned char dl, dh;
};

union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
29デフォルトの名無しさん:05/02/23 00:28:01
class Base {}:
class E1 : public Base {};
class E2 : public Base {};
class E3 : public Base {};
のとき、
union E {
Base* b;
E1* e1;
E2* e2;
E3* e3;
};
として、「失敗しないダイナミックキャスト(じゃ無いけど、それに似た何か)」を表現できないだろうか
30デフォルトの名無しさん:05/02/23 01:20:46
E e;
e.b = new Base();
e.e3->funce3();

簡単にクラッシュですね
31デフォルトの名無しさん:05/02/23 04:11:54
>>29 は多態を実現したいのか?
それなら最初から Base *b = new E3(); で問題ないだろ?
3211:05/02/23 12:27:14
>>20
なるほど
それが噂のC#か
幕メインになりそうなんで今後使うかどうかかなり謎だが
複雑な文法だな
何がなんだか
33デフォルトの名無しさん:05/02/23 19:46:53
>>20は、ネイティブのDLLで使われてる共用体を使うためのC#共用体宣言。
C#本来の仕組みで共用体っぽいものを実現するなら、
こんな実装になるかねぇ。

public class YattaIkematen{
  private int number;

  public int WindowsActivationDisablizer{
    get{
      return number;
    }
    set{
      number = value;
    }
  }

  public int AccessHereToWarez{
    get{
      return number;
    }
    set{
      number = value;
    }
  }
}
3411:05/02/23 20:56:57
>>33
まぁようするにオブジェクト指向とゆうわけだな
徹底しとりますな
ある意味使いやすそうな気はしないでもない
35デフォルトの名無しさん:05/02/24 22:10:10
typedef struct tagPOINT
{
unsigned short x;
unsigned short y;
} POINT;

typedef struct tagRECT
{
union {
struct {
unsigned short Left, Top, Right, Bottom;
};
struct {
tagPOINT TopLeft, BottomRight;
}
}
} RECT;


RECT rect;

rect.Left = 10;
rect.Top = 20;
rect.BottomRight.x = 100

みたいなことってできなかったっけ?
36デフォルトの名無しさん:05/02/24 22:18:50
>>35
出来ると思うが。
37デフォルトの名無しさん:05/02/24 22:19:58
( ゚д゚)ポカーン

Cなら、>>17のような使い方で共用体は普通に使う(もちろんC++じゃ出番なし)。

Cの入門書の良し悪しを判定するには共用体の説明を見ればいい、って説があったけど、
このスレの連中は糞本しか読んでないのか。
38デフォルトの名無しさん:05/02/24 22:30:08
C言語自体の入門書読まずにプログラミング始めたからなぁ
自分の書いたコードではunion確か使ってないし
39デフォルトの名無しさん:05/02/24 22:39:54
>>37
俺は、似たようなことをやるのに、共用体じゃなくて

typedef struct{
  void* data;
  void ( *func1 )( void );
  int (*func2)( int n );
}

こんな感じで、汎用のバッファにmallocして、
関数ポインタに、それを処理する関数を登録する方法でやってた。

今から思えば、クラスと仮想関数だな…
40デフォルトの名無しさん:05/02/24 23:22:37
>>14
へぇ。

ヘッダ部は同じでエンベロープが数種類ある通信フォーマットにはめ込んで使ったりします。

union body{
struct format_a a_shiten_data;
struct format_a old_a_shiten_data;
struct format_a b_shiten_data;
}

struct data{
struct head header;
union body bodies;
}


struct data dat;

recv(sock,&dat,sizeof(dat));

switch(dat.type){
case 1:
dat.a_shiten_data〜
case 2:
dat.a_old_shiten_data〜
・・・
}
41デフォルトの名無しさん:05/02/24 23:25:37
旧時代の化石は業界から消えろ
42デフォルトの名無しさん:05/02/24 23:33:32
>>41
物事の本質を見なさい。
ただのプログラマ。
43デフォルトの名無しさん:05/02/24 23:37:08
>>42
あれですか?

10年前に引退しそこなった中年さんですか?
44デフォルトの名無しさん:05/02/24 23:45:27
プログラマとしてヘタレだったオッサンほど

「ただの管理職」になって、
自分の知らない実装技術=業務には使えないオナニー

って発想で会社をグダグダにするんだよね。
45デフォルトの名無しさん:05/02/24 23:47:39
ま、そんなオッサンは、ITゼネコンのクローズドな自治体システムの保守でもやって
細々と食いつないでくれたまえ。

で、頼むから外の世界に出てこないでね^^
46デフォルトの名無しさん:05/02/25 01:16:30
Pascalやってたせいでレコード型の可変部のイメージで共用体を>>17のように使っていた。
共用体の方がシンプルで自由度が高いのでそうじゃない使い方も行き当たりばったりで使ったりしている。
47デフォルトの名無しさん:05/02/25 08:51:41
>>40のコードは、軽く考えただけでも

・同じエンディアンのマシンで
・同じパディングのコンパイラで
・同じメモリイメージを展開するネットワークライブラリ

じゃないと動かなくなるな。
まぁ、永久に同じ汎用機をメーカーから定価で買い続けて
ソフトも同じものを永久に使い続けるなら、これでいいか。

48デフォルトの名無しさん:05/02/25 15:36:59
struct Color{
 union{
  struct{
   float r,g,b,a;
  };
  float[4];
 }
}

こうすると初期化のときとかfor文が使えて便利。
エンディアンとかは考えてないが。
49デフォルトの名無しさん:05/02/25 16:18:07
>>48
この場合、エンディアンは全く関係ないね。
50デフォルトの名無しさん:05/02/25 20:14:30
>>49
struct Color color = { 0.0f, 0.0f, 0.0f, 0.0f };
じゃいかんのか?
構造体の初期化式を知らない?
5148じゃないが:05/02/25 21:03:41
>>50
初期化式なんて宣言のときしか書けないし、定数式しか書けないしで、
使える範囲がかなり限定されると思うが。
たとえばこんなのは、
typedef struct {
 union {
  struct {
   double x;
   double y;
   double z;
  } s;
  double a[3];
 }
} Point3D;

行列かけたりする時には便利だろうね。邪悪な気がするので俺はやらないが。

Colorの場合の用途は俺はよく知らんが、画像フィルタやら何やらで使い道はあるんだろ。
52デフォルトの名無しさん:05/02/25 21:09:24
>>50
構文上の初期化じゃないんじゃない?
グラデーションの色テーブルとか
53デフォルトの名無しさん:05/02/26 09:01:10
>>47
ん?なんで?
共用体で定義してる構造体間には何の関連もないよ。
どのデータ構造を受信したかは共通のヘッダ部に記述してある。
それによって使う構造体を変える。

intの変数をchar4つでも見たいなぁ。的な共用体の使い方とは根本的に違います。

ネットワークバイトオーダとマシンのバイトオーダが違う場合は当然エンディアン変換を行います。
アライメントは調整するのは当たり前として。
recvで取ってきてるように送られてくるのはソケットからのストリームなのでリニアに綺麗に並ぶはずですね。
アライメントをあわす前提ならば問題ないです。



54デフォルトの名無しさん:05/02/26 12:07:50
「Color」は適当な例が無かったから適当につけただけなのであんまりこだわらないでほしいなぁ。
僕は、まー、Colorをメタセコのパーサーで使ってるんだけど、どうだろう・・・。
sscanfとか、iostreamで、わざわざ各要素ごとに指定するのは面倒なんで、こういう方法をとっている。
より良い方法は模索中である。
55デフォルトの名無しさん:05/02/26 12:37:18
struct Color{
union{
struct{
float r,g,b,a;
};
float[4];
}
}
タグ名ないときは
Color c;
c.r
c.g
c.b
c.a
でアクセスできるの?
56デフォルトの名無しさん:05/02/26 12:43:36
>>55
その通り。
57デフォルトの名無しさん:05/02/26 14:47:47
c[0]
c[1]
とかもOK?
58デフォルトの名無しさん:05/02/26 16:51:13
>>57
そこはコンパイルエラー。
59デフォルトの名無しさん:05/02/26 19:59:34
>>57
operator[](int index)をメンバとして定義すればいいね。union使わないとできない手法だね。
ただし>>55のような無名unionのショートカット的参照は正式な文法じゃないのだが。
どうような手法はC・C++でSSEを使うときには__m64,__m128を使うんだけど
こいつらからfloat,doubleを取り出すときにつかうね。
60デフォルトの名無しさん:05/02/26 20:01:50
sage忘れorz
61デフォルトの名無しさん:05/03/03 23:21:20
あらゆるオブジェクトをさす事が出来る void* ってのがあるが、
それのオブジェクト(っていうか実体)バージョンが
unionだと思えばよいのかな。
そう思う事にしようっと。
62デフォルトの名無しさん:05/03/03 23:27:48
大誤解。
63デフォルトの名無しさん:05/03/05 00:05:43
voidクラスがあるとすれば正解?
64デフォルトの名無しさん:05/03/05 00:33:52
あろうがなかろうが違う
65デフォルトの名無しさん:05/03/06 15:58:17
>>24
ITU・・・H8かw
組み込み系の人間は少ないのか?
66デフォルトの名無しさん:2005/04/12(火) 01:38:15
組み込み系だと当然の様に使う。

なぜなら、ハード的な入出力(CPUのI/O)は、ビットで入ってくるからね。
union{
uchar BYTE;
struct{
}
}
67デフォルトの名無しさん:2005/04/12(火) 01:42:31
途中でおくちゃった・・・

union{
  uchar BYTE;
  struct{
       uchar b7:1;
       uchar b6:1;
       uchar b5:1;
       uchar b4:1;
       uchar b3:1;
       uchar b2:1;
       uchar b1:1;
       uchar b0:1;
  }BIT;
}

みたいな書き方ね。

論理演算の出来ない俺みたいな奴にとっては、
移植性が低くい << 便利
だからなw
68デフォルトの名無しさん
アラインメント合わせる為にダミー入れてやったり