無差別に技術をついばむ鳥

情報処理技術全般を気まぐれにつつくゆるいブログです

Dをつつく18ー共用体。皆で仲良くルームシェア。

おはピヨ。今回は共用体を楽習するぞ。 共用体というものを使った事が無い人が居ると思うからまずは説明するピヨ。 共用体というのは、同じ記憶空間を共用する構造のことだピヨ。
例えば、共用体にuintとushortのフィールドがあって、uintに0xAAAABBBBの値を代入したら、共用されているからushortのフィールドの値はBBBBになるんだ。
早速実験してみよう。

import std.stdio;

union Register {
public:
    ushort AX;
    uint EAX;
}

int main( char[][] ) {  
    Register reg;
    writeln( "共用体のサイズ", reg.sizeof );
    reg.EAX = 0x_AAAA;
    writef( "EAX=%x", reg.EAX, "\n" );
    writeln( "AX=", reg.AX );
    return 0;
}

このサンプルプログラムを実行してみよう。EAXフィールドの値が0xAAAAならば、AXフィールドの値も0xAAAAになるはずピヨッ。あれ?0が出たぞ?どうなっているんだ・・・
静的初期化じゃなければだめなのかなぁ?

import std.stdio;

union Register {
public:
    ushort AX;
    uint EAX;
}

int main( char[][] ) {  
    Register reg;
    writeln( "共用体のサイズ", reg.sizeof );
    reg.EAX = 0x_AAAA;
    writef( "EAX=%x", reg.EAX, "\n" );
    writeln( "AX=", reg.AX );
    reg.AX = 5;
    writef( "EAX=%x", reg.EAX, "\n" );
    writeln( "AX=", reg.AX );

    //静的初期化
    static Register reg1 = { EAX:0x0000AAAA };
    writef( "EAX=%x", reg1.EAX, "\n" );
    writeln( "AX=", reg1.AX );
    return 0;
}

あれぇ・・・やっぱり駄目だ。共有されていない。しかも構造体と同じ動きをするぞ・・・
もうこれはdmd2.014のバグとしか思えないピヨ。
この現象の解決法を知っている人はコメントで教えて下さい。
別窓 | D | コメント:0 | トラックバック:0 | ∧top | under∨
<<Dをつつく19−クラス。何が出来るかな♪ | 無差別に技術をついばむ鳥 | 中の人の徒然草35>>

この記事のコメント

∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

∧top | under∨
| 無差別に技術をついばむ鳥 |