[union]共用体を駆使するスレ[union]
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
05/02/20 13:16:51なんに使って良いのか、全然解んないけど。
0002デフォルトの名無しさん
05/02/20 13:19:52http://www.seinen-u.org/
0003デフォルトの名無しさん
05/02/20 13:23:36俺は使うけど。
無駄をなくすのに使っていいのか、全然解んないけど。
0004デフォルトの名無しさん
05/02/20 13:26:510005デフォルトの名無しさん
05/02/20 13:44:35すれ立てるまでもない質問はここで 第65刷
http://pc5.2ch.net/test/read.cgi/tech/1108815602/
0006デフォルトの名無しさん
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 { |彡へ .} ヽ、::::::::::::....
0007デフォルトの名無しさん
05/02/20 14:24:000008デフォルトの名無しさん
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 { |彡へ .} ヽ、::::::::::::....
0009デフォルトの名無しさん
05/02/20 14:38:070010デフォルトの名無しさん
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 { |彡へ .} ヽ、::::::::::::....
0011デフォルトの名無しさん
05/02/20 14:43:56int WindowsActivationDisablizer;
int AccessHereToWarez;
} YattaIkematen;
文法これで合ってるかな・・・
0012デフォルトの名無しさん
05/02/20 14:46:58エンディアンを確認するためとか
0013デフォルトの名無しさん
05/02/20 15:07:31インディアンを確保するためとか
0014デフォルトの名無しさん
05/02/20 18:52:32メモリがふんだんに使える今、あえて使う理由などない。
かえってバグの原因になる。
0015デフォルトの名無しさん
05/02/21 00:33:30良いことなのか悪いことなのか、幸福なのか不幸なのか、その辺知らんけど。
0016デフォルトの名無しさん
05/02/21 00:53:160017デフォルトの名無しさん
05/02/21 02:31:55int type
union {
...
} u;
};
こんな感じのコードを昔はよく書いたな。
0018デフォルトの名無しさん
05/02/21 03:08:05switch 使いまくらないといけないのが結局無駄
0019デフォルトの名無しさん
05/02/21 03:10:06取得する時はunion使うよね
文字列を逆にしないといけないが。
0020デフォルトの名無しさん
05/02/21 23:05:12これが正しい文法だ。
今後のWindowsではなw
[StructLayout(LayoutKind.Explicit)]
public struct YattaIkematen
{
[FieldOffset(0)]public int WindowsActivationDisablizer;
[FieldOffset(0)]public int AccessHereToWarez;
}
0021デフォルトの名無しさん
05/02/21 23:06:260022デフォルトの名無しさん
05/02/22 08:47:13どんなとき?
そんなケース、想定できないんだけど
0023デフォルトの名無しさん
05/02/22 09:10:000024デフォルトの名無しさん
05/02/22 10:21:58union { /* 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 */
0025デフォルトの名無しさん
05/02/22 12:07:50union をメモリ節約のために使うなぞ、莫迦のする事。
じゃあなんの為に使うのかというと……正直、使い道なんかない。
複数の構造体を並べて、その最大サイズでメモリに割り付けられるくらい。
>>17
Xlib には、そーゆーのが現存する。
tp://xjman.dsl.gr.jp/X11R6/X11/CH10.html
0026デフォルトの名無しさん
05/02/22 13:05:360027デフォルトの名無しさん
05/02/22 21:08:22unsigned 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;
};
0028デフォルトの名無しさん
05/02/22 21:10:02struct 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;
};
0029デフォルトの名無しさん
05/02/23 00:28:01class E1 : public Base {};
class E2 : public Base {};
class E3 : public Base {};
のとき、
union E {
Base* b;
E1* e1;
E2* e2;
E3* e3;
};
として、「失敗しないダイナミックキャスト(じゃ無いけど、それに似た何か)」を表現できないだろうか
0030デフォルトの名無しさん
05/02/23 01:20:46e.b = new Base();
e.e3->funce3();
簡単にクラッシュですね
0031デフォルトの名無しさん
05/02/23 04:11:54それなら最初から Base *b = new E3(); で問題ないだろ?
0033デフォルトの名無しさん
05/02/23 19:46:53C#本来の仕組みで共用体っぽいものを実現するなら、
こんな実装になるかねぇ。
public class YattaIkematen{
private int number;
public int WindowsActivationDisablizer{
get{
return number;
}
set{
number = value;
}
}
public int AccessHereToWarez{
get{
return number;
}
set{
number = value;
}
}
}
0035デフォルトの名無しさん
05/02/24 22:10:10{
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
みたいなことってできなかったっけ?
0036デフォルトの名無しさん
05/02/24 22:18:50出来ると思うが。
0037デフォルトの名無しさん
05/02/24 22:19:58Cなら、>>17のような使い方で共用体は普通に使う(もちろんC++じゃ出番なし)。
Cの入門書の良し悪しを判定するには共用体の説明を見ればいい、って説があったけど、
このスレの連中は糞本しか読んでないのか。
0038デフォルトの名無しさん
05/02/24 22:30:08自分の書いたコードではunion確か使ってないし
0039デフォルトの名無しさん
05/02/24 22:39:54俺は、似たようなことをやるのに、共用体じゃなくて
typedef struct{
void* data;
void ( *func1 )( void );
int (*func2)( int n );
}
こんな感じで、汎用のバッファにmallocして、
関数ポインタに、それを処理する関数を登録する方法でやってた。
今から思えば、クラスと仮想関数だな…
0040デフォルトの名無しさん
05/02/24 23:22:37へぇ。
ヘッダ部は同じでエンベロープが数種類ある通信フォーマットにはめ込んで使ったりします。
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〜
・・・
}
0041デフォルトの名無しさん
05/02/24 23:25:370042デフォルトの名無しさん
05/02/24 23:33:32物事の本質を見なさい。
ただのプログラマ。
0043デフォルトの名無しさん
05/02/24 23:37:08あれですか?
10年前に引退しそこなった中年さんですか?
0044デフォルトの名無しさん
05/02/24 23:45:27「ただの管理職」になって、
自分の知らない実装技術=業務には使えないオナニー
って発想で会社をグダグダにするんだよね。
0045デフォルトの名無しさん
05/02/24 23:47:39細々と食いつないでくれたまえ。
で、頼むから外の世界に出てこないでね^^
0046デフォルトの名無しさん
05/02/25 01:16:30共用体の方がシンプルで自由度が高いのでそうじゃない使い方も行き当たりばったりで使ったりしている。
0047デフォルトの名無しさん
05/02/25 08:51:41・同じエンディアンのマシンで
・同じパディングのコンパイラで
・同じメモリイメージを展開するネットワークライブラリ
じゃないと動かなくなるな。
まぁ、永久に同じ汎用機をメーカーから定価で買い続けて
ソフトも同じものを永久に使い続けるなら、これでいいか。
0048デフォルトの名無しさん
05/02/25 15:36:59union{
struct{
float r,g,b,a;
};
float[4];
}
}
こうすると初期化のときとかfor文が使えて便利。
エンディアンとかは考えてないが。
0049デフォルトの名無しさん
05/02/25 16:18:07この場合、エンディアンは全く関係ないね。
0050デフォルトの名無しさん
05/02/25 20:14:30struct Color color = { 0.0f, 0.0f, 0.0f, 0.0f };
じゃいかんのか?
構造体の初期化式を知らない?
005148じゃないが
05/02/25 21:03:41初期化式なんて宣言のときしか書けないし、定数式しか書けないしで、
使える範囲がかなり限定されると思うが。
たとえばこんなのは、
typedef struct {
union {
struct {
double x;
double y;
double z;
} s;
double a[3];
}
} Point3D;
行列かけたりする時には便利だろうね。邪悪な気がするので俺はやらないが。
Colorの場合の用途は俺はよく知らんが、画像フィルタやら何やらで使い道はあるんだろ。
0052デフォルトの名無しさん
05/02/25 21:09:24構文上の初期化じゃないんじゃない?
グラデーションの色テーブルとか
0053デフォルトの名無しさん
05/02/26 09:01:10ん?なんで?
共用体で定義してる構造体間には何の関連もないよ。
どのデータ構造を受信したかは共通のヘッダ部に記述してある。
それによって使う構造体を変える。
intの変数をchar4つでも見たいなぁ。的な共用体の使い方とは根本的に違います。
ネットワークバイトオーダとマシンのバイトオーダが違う場合は当然エンディアン変換を行います。
アライメントは調整するのは当たり前として。
recvで取ってきてるように送られてくるのはソケットからのストリームなのでリニアに綺麗に並ぶはずですね。
アライメントをあわす前提ならば問題ないです。
0054デフォルトの名無しさん
05/02/26 12:07:50僕は、まー、Colorをメタセコのパーサーで使ってるんだけど、どうだろう・・・。
sscanfとか、iostreamで、わざわざ各要素ごとに指定するのは面倒なんで、こういう方法をとっている。
より良い方法は模索中である。
0055デフォルトの名無しさん
05/02/26 12:37:18union{
struct{
float r,g,b,a;
};
float[4];
}
}
タグ名ないときは
Color c;
c.r
c.g
c.b
c.a
でアクセスできるの?
0056デフォルトの名無しさん
05/02/26 12:43:36その通り。
0057デフォルトの名無しさん
05/02/26 14:47:47c[1]
とかもOK?
0058デフォルトの名無しさん
05/02/26 16:51:13そこはコンパイルエラー。
0059デフォルトの名無しさん
05/02/26 19:59:34operator[](int index)をメンバとして定義すればいいね。union使わないとできない手法だね。
ただし>>55のような無名unionのショートカット的参照は正式な文法じゃないのだが。
どうような手法はC・C++でSSEを使うときには__m64,__m128を使うんだけど
こいつらからfloat,doubleを取り出すときにつかうね。
0060デフォルトの名無しさん
05/02/26 20:01:500061デフォルトの名無しさん
05/03/03 23:21:20それのオブジェクト(っていうか実体)バージョンが
unionだと思えばよいのかな。
そう思う事にしようっと。
0062デフォルトの名無しさん
05/03/03 23:27:480063デフォルトの名無しさん
05/03/05 00:05:430064デフォルトの名無しさん
05/03/05 00:33:520065デフォルトの名無しさん
05/03/06 15:58:17ITU・・・H8かw
組み込み系の人間は少ないのか?
0066デフォルトの名無しさん
2005/04/12(火) 01:38:15なぜなら、ハード的な入出力(CPUのI/O)は、ビットで入ってくるからね。
union{
uchar BYTE;
struct{
}
}
0067デフォルトの名無しさん
2005/04/12(火) 01:42:31union{
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
0068デフォルトの名無しさん
2005/05/01(日) 18:19:04■ このスレッドは過去ログ倉庫に格納されています