mfc-ml

2000年02月

29

[mfc 22395] Re: 浮動小数点

> 「そもそもunionを使わなければならない理由は何でしょうか?」

私の場合は、例えばdoubleとunsigned char[8]とで
unionを作っておくことで、ファイル保存する時のバイト順を
簡単に入れ替えることができるため、
unionを使う習慣があります。
例えばファイル保存データをビッグエンディアンと決めておいて、
ファイル保存ルーチンのほうで、プラットフォーム毎の処理を記述するわけです。
あるプラットフォームでは、char[0]から順番に書き込む処理になっていて、
別のプラットフォームでは逆順だったり...
だから、私の場合unionの一方は必ずunsigned charの配列です。
29

[mfc 22394] Re: VBの DoEvent ってVCでは?

しげです。


> ダイアログの画面を閉じてそれによる処理が重く、メイン画面上に
> 表示してあったダイアログの矩形の部分だけしばらく描画がされません。
> VisualBasicだとDoEventという関数があり
> 強制的に表示させる事が可能ですが、VC(MFC)では
> どのようにすれば良いのでしょうか?


    [mfc 21254] モーダルダイアログの消えるタイミング

の一連のやり取りを読めば、ヒントになるかもしれませんね。
29

[mfc 22393] Re: 浮動小数点

> このツリー全般に思うのですが、
> 「そもそもunionを使わなければならない理由は何でしょうか?」

> わざと判りにくくしているようにしか思えないんですけども???

(他の人は知らないが)わたしの場合に限っては、メモリイメージの解釈を
変更する場合には、union を使うのが習慣なんでする。
同一領域を異なる見方で見ているという事が(自分としては)はっきりするので...

あと、貧乏性なんで、メモリコピーが嫌いなの(笑)(これはだいぶ嘘かも)
union やめて~という要望が出た場合には、好み的には、メモリコピーより
きっとキャストバリバリのマクロを定義するんじゃないかな、私の場合。

ではでは。
29

[mfc 22392] Re: 浮動小数点

>あのー。自信ないんですけど、
>1バイトが8ビットってことは16進数で2文字だから
>8バイトってことはやっぱり
>    0xFFFFFFFFFFFFFFFF
>ではなかったですっけ?(^^;

済みません16桁と16バイトとうっかり勘違いしてました
ほんとに御免なさい

>それはそうとやっぱりちゃんと動作しません。

>    union U_DL{
>        double dt;
>        long l[2];
>    } x;
>    x.dt = -20.0;
>    printf("%8x%8x",x.l[0],x.l[1]);

>だとWindowsNTで出力は

>    00000000c0340000

>になりました。

だから、メモリーイメージとレジスターイメージとでは
バイト順が違うといいましたでしょう?
メモリーイメージではそうなっていますが
レジスターイメージでは
0xc03400000000000 で、これが実際のビットイメージです
メモリー  :LLL LLH LHL LHH HLL HLH HHL HHH
レジスター:HHH HHL HLH HLL LHH LHL LLH LLL
       B   B   B   B  | B   B   B   B
     |      W      |      W      |      W      |       W     |
     |          DW(32bit)         |          DW(32bit)         |
という関係です
恐らく longlong か int64 かでユニオンを作っていれば
間違わなかったのでしょう

>文字列の読み取りの部分は以下です。

>    union U_DC{
>        double dt;
>        char c[16];
>    } y;

ユニオン(共用体)についてきちんと理解できていれば

union U_DC{
    double dt;
    unsigned char c[8];
} y;

と定義するのでしょう
各要素の一致する部分が共有できるのです
c[16] と定義したら、初めの8つまでが共有できるのです
dt よりも大きい部分-- c[8] から c[15] --までもが
同じ領域を共有できるはずがありませんね
しかもこういうことが確実にいえるのは X86 のような
バイト単位にアクセス可能な機械についてであって
ワードマシンでは上手く行かない場合もあるようです
1バイトが2ニブルなのだから上位ニブル下位ニブルに分けて
1バイトを再構成する必要があるでしょう

>    CString buf = "00000000c0340000"
>    int slen = buf.GetLength();
>    for(int i=0; i<slen; i++){
>        if('0' <= buf[i] && buf[i] <= '9')
>            y.c[i] = buf[i]-'0';
>        if('a' <= buf[i] && buf[i] <= 'z')
>            y.c[i] = buf[i]-'a' + 10;
>    }

それから、上のような書き方は文字コードが ASCII/JIS であることを
前提にしていますね
私なら
char table[] ="0123456789ABCDEF";
とでもしておいて
memset(&y, 0, sizeof(y));    /* 出来るだけ初期化すること */
for (int i =0; i <slen; i++)    {
    int pos =strchr(table, toupper(buf[i])) -table; /* ここは怪しい */
    if (i %2 ==0)    {
        y.c[i] =pos <<8;
    }
    else    {
        y.c[i] |=pos;
    }
}
とするでしょう
29

[mfc 22391] VBの DoEvent ってVCでは?

ダイアログの画面を閉じてそれによる処理が重く、メイン画面上に
表示してあったダイアログの矩形の部分だけしばらく描画がされません。
VisualBasicだとDoEventという関数があり
強制的に表示させる事が可能ですが、VC(MFC)では
どのようにすれば良いのでしょうか?
記事検索
Amazon.co.jp
  • ライブドアブログ