////////////////////////////////////////////////////////////////////
/*

    KAB-studio.h


    (C)KAB-studio 1999 - 2002 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com

    送信日： 2002/02/18(Mon) No.145
    配信数： 3760 ( Mag2 + Pubzine )
＊    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine ( URL: http://www.pubzine.com/  ID: 590 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
/*                ２００２年２月１８日（月）の更新                */
http://www.kab-studio.com/

・ＣＧギャラリー整理しませんでした
　 CG Gallery を整理するかも……とか言ってましたが、結局しませんでし
た。理由は、まだホームページ容量があることや、日記から直リンクしてた
こととか。とういわけで今週は更新なしですねー。
[ CG Gallery ]
http://www.kab-studio.com/CG/Gallery/


////////////////////////////////////////////////////////////////////
/*                        チョー普通な日記                        */
http://www.kab-studio.com/nikki2/

2002/02/10 (Sun)
　何もせずにのんびり。風邪だし。今日の一枚描いたくらい。寝る前にバー
チャすると勝率悪い……。そして卒論ピンチ。共同作業でもしてなんとか書
くしか。

2002/02/11 (Mon)
　休みだけど眠い。あずまんがカレンダー買ったりぷらとわ書いたり。 
ATOK15 を入れたら VC のデバッグで例外を拾うのが見れたり。そういえば
かぶスタの表紙ってどうです？　会社で見れます？

2002/02/12 (Tue)
　プログラミング＆客先作業。疲れたっす。テレビはフルメタがメリハリ効
いてていい感じ。そして卒論？の添削。まとめがうまくいけばなんとかなる
でしょ。そしで「どない」と表紙。表示される前にゴー！

2002/02/13 (Wed)
　不具合が出た関係で会社行ってすぐ客先へ。そのあとお客さんの作業を
ぼーっと見守ることに。晩ご飯はカレー店カザーナで。結構おいしいけど高
い。むぅ。

2002/02/14 (Thu)
　今日はずっとプログラミング。仕様変更の噂が出るも消える。 STL 使い
まくりでいい感じ。 for ループがひとつもない……。アメリカで VS.NET 
発売。上の欲しい気もする……。

2002/02/15 (Fri)
　昨日スマブラ大会で徹夜。プリンいい感じ。金曜のお仕事は客先でテス
ト、もうまくいかず。プログラミングは、なんか思い違いをしてたのかも？
普通の組込型や std::string って引数に使うべきじゃないのかも。深みに
はまりそう……。まほ様〜。みずほ先生〜。姉妹で素晴らしい〜。

2002/02/16 (Sat)
　まだ眠い。何もしてないし。Ｎスペが良かったかなー。一流を揃えるとこ
ろがすごいです。そしてクラス作り。今は変数がいっぱいあって混乱、でも
それをクラスに置き換えた所でどうにかなるのかどうか。情報の集中化の問
題も。難しいですなぁ。


////////////////////////////////////////////////////////////////////
/*                         風雅、舞い                             */
http://www.kab-studio.com/Novel/Fuga/

■　第三章　きもち　−８−

『迷いのない世界へと導き給え！』
　ディルトの第二撃がリシュネへと襲いかかる。しかし、その気流は中心を
突き破られ、周りへと飛び散る。
「何！？」
「押し込め！！」
　リシュネの両手から放たれた空気の塊が、ディルトのものを押しのけてい
く。そしてそれは、ディルトに躱す暇も与えず、直撃した。うめき声を上げ
ながら、ディルトは木の葉のように舞い上がっていった。
　それを確認したあと、リシュネはリラックスした姿勢で立ち、目を閉じ
た。小声でつぶやく言葉は、人のものではない。上から見下ろす女性や後ろ
に立つ少年が見守る中、体中の傷すべてが、同時に痕もなくふさがった。
　バージョンの差なんて、ほとんどないな。少年は感じた。
　リシュネの目が開かれる。その瞳は、獲物を狩る鷹のようだった。体を一
瞬大きく振ると、撥水加工の施された傘のような肌を血がすべて滑り落ち
た。宙に浮くディルトの落下点へと、リシュネは駆け出す。
『すべての元となるものよ、今ここに集いその大いなる力を示せ！』
＜やめなさいリシュネ！！＞
　ディルトは途中からは自分から飛び、天井近くの壁を強く蹴って、弾丸の
ようにリシュネへと飛んでいった。その姿を睨み付けながら、リシュネは不
敵に笑んだ。
「ディルト、死んじゃうかなぁ」
　少年はいやらしく笑った。
＜全回復にどれだけかかると思ってるのっ！＞
　マイクを掴んで叫ぶ女性は、最悪の事態を想定して青ざめながらも紅潮し
ていた。
　そんなことに意を介することなく、リシュネはディルトへと構えた。両足
を強く踏ん張り、両手を高速で飛来するディルトへと向けて、呪文の詠唱を
続けた。
『集いし力よ、我が示した道を進みその意を遂げよ！！』
　一瞬。０．０１秒。
　少年は呪文が違うことに気づいてリシュネへと跳んだ。
　ディルトはそのことに気づいていたが、それが意味することを理解するた
めには時間が僅かすぎた。
　リシュネは、ちょっとやばかったかなと思った。
　人間は、その時間では反応することができなかった。
　リシュネの両手の先に、空間の歪みが生じる。その周りに光が生まれ、そ
の光がディルトへと数十センチ進んだ時。
　ディルトは驚愕と恐怖と怒りに駆られながら体を反らした。何が起こった
のか、少なくともディルトには判らない理由によって、彼の右腕は消し飛ん
だ。
　深呼吸をするように両腕を広げた状態で、リシュネは後ろへと吹っ飛ん
だ。床がささくれ立ち、そこに血痕の線が曳かれた時に、少年がリシュネを
背中から押さえて止めた。
「無茶して……」
「練習にならないもの、本気出さなきゃ」
　ディルトはきりもみを描いて床に激突し、転がった。上を見上げれば、窓
越しに慌てふためいている様子が見えた。
「先生には悪いことしちゃったな。左さんがいるときにすれば良かったの
に」
「そう？」
　リシュネはさらりと答えた。
                                                              (続く)


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『次の水曜は Java メルマガね』
「２０日に１１号【こまごまとしたこと】が発行されます」
『この回とか、ホントに Java 知ってないとわかんないことだよね』
「アダプターとかね。その辺まで解説しちゃうと大変だから」
『このアダプターとかって、 C++ でも必要？』
「積極的に使うことはないけど、教えはするよ」
『使わないけど教わる？』
「アダプターとか Java では普通だけど C++ ではまだ広まってなくて」
『いつか広まる？』
「と思うからね。どうしてもあとの方になっちゃうけど」
『まだまだ道のりは長いってわけね』
「 C++ だとどうしてもその前に教えとかなきゃいけないことがあるから」
『いつになったら全部教えてもらえるのかなー』
「あと数年かかるかもね……」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.com/Programing/PragmaTwice/

　Version 8.03
インスタンスとメモリ

「前回はインスタンスハンドルについて見てみました」
『 0x00400000 ってアドレスから、実行ファイルそのものが入ってたんだよ
ね』
「そうそう。で、この値の切りの良さとかの理由を今回は解説します。
えーっとまず、このプログラムでちょっと確認してもらおうかな」

#include <Windows.h>
#include <stdio.h>

int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    // インスタンスハンドルを文字列化します。
    char pchMsg[1024];
    sprintf( pchMsg, "HINSTANCE : %x", p_hInstance );
    // それを表示。
    MessageBox( NULL, pchMsg, "WinMain()", MB_OK );
    return 0;
}

『んーと、インスタンスハンドルを sprintf() で文字列に入れて、それを
ダイアログに出すわけね』
「 sprintf() については Version 5.07 ( No.072 ) を参照」
『あれ？　でもその時って stdio.h なんてインクルードしなかったよね』
「あのときは MFC を使ってたから。 Version 6.04 ( No.104 ) でちょっと
触れたけど、 MFC はたいがいのランタイムをインクルードしてるから」
『 MFC を使わないときは、 Windows.h も、 stdio.h もインクルードしな
きゃいけないわけね。めんどー』
「それはまぁ MFC の便利なところだけど」
『あとさ、なんでわざわざダイアログで出すの？　この前みたくデバッグ
ウィンドウで見ればいいじゃん』
「それは、いくつも起動するから。 SimpleDialog\Debug にある 
SimpleDialog.exe をいくつも起動して」
『ほいほいほい。全部ダイアログ出て……全部 40000000 だ、インスタンス
ハンドル』
「まずこれを確認してもらいたかったんだよね。インスタンスハンドルはア
プリ固有で、実行ファイルそれぞれじゃ違わないってことを」
『ん？　当たり前っぽい気もするけど』
「あ、そーか。じゃあ今度はこれ」

#include <Windows.h>

#include <stdio.h>
#include <time.h>

int WINAPI WinMain
    ( HINSTANCE p_hInstance
    , HINSTANCE p_hPrevInstance
    , LPSTR p_pchCmdLine
    , int p_iCmdShow
    )
{
    // ランダムな値を取得。
    time_t lTime_t;
    time( &lTime_t );
    srand( lTime_t );
    int i = rand();
    // それを文字列化。
    char pchMsg[1024];
    sprintf( pchMsg, "int i : %x, %d", &i, i );
    MessageBox( NULL, pchMsg, "WinMain()", MB_OK );
    return 0;
}

『変数 i にランダムな値入れて、その i のアドレスと i の中身を出力、
ね』
「乱数については Version 7.19 ( No.139 ) を参照」
『 time.h は time() とか使うためのだよね。これも？』
「そう、これも MFC はインクルードしてくれてました」
『そんなんばっかねー。で、実行実行実行っと。お、全部アドレスは同じだ
けど、値はランダムだから違うね』
「この辺が重要。まず、値がそれぞれ違うってことは、実行したそれぞれで
i の中身が違うってこと」
『？　当たり前……あ、なんかさっきのインスタンスハンドルと矛盾？』
「ってゆーか、こっちを中心に考えた方がいいかな」
『どゆこと？』
「この前見たメモリウィンドウ、あんなふうにメモリは広がってます」
『うん、広がってます』
「で、あの広がってる世界が、実行した分だけ作られるんです」
『え！？　だってメモリの中じゃ……』
「そう、そこが重要。いつもメモリウィンドウで見てたのは、仮想的なメモ
リなんです」
『メモリのパチモン！？』
「偽物じゃなくて、見え方が違うって感じかな。実際にメモリ上にああいう
風に置かれてはいるけど、アドレスは違うって感じ」
『いまいちよく分からない……』
「そうだね、たとえば」

ハードウェアとしてのメモリ
[アドレス]
1001
1002        ひとつめに実行したアプリの i 
1003
1004
1005
1006        ふたつめに実行したアプリの i
1007
1008

「って感じにハードウェア上のメモリ上には、実行した分だけ中の変数 i 
が作られます」
『でも、アドレスは同じだった』
「それは」

ひとつめに実行したアプリの仮想メモリ
[アドレス]
00005001
00005002
00005003        i （ハードウェア上では 1002 に置かれてる）
00005004
00005005

ふたつめに実行したアプリの仮想メモリ
[アドレス]
00005001
00005002
00005003        i （ハードウェア上では 1006 に置かれてる）
00005004
00005005

「って感じに、仮想的なメモリがそれぞれに割り当てられてるから」
『ってことは、ひとつの変数にアドレスがふたつあるの？』
「実際にはそういう事。 i って変数が 5003 ってアドレスと実際のハード
としてのメモリ上のアドレスとふたつ。ただ、ハード上のは見えないから考
える必要はないけどね」
『でも考えてるじゃない』
「そりゃ、こういうこと知ってないといけないし」
『ぶー』
「で、インスタンスハンドルに話を戻します」
『ってことは』

ひとつめに実行したアプリの仮想メモリ
[アドレス]
00400000        実行ファイルの中身
00400001
00400002

ふたつめに実行したアプリの仮想メモリ
[アドレス]
00400000        実行ファイルの中身
00400001
00400002

『って感じに置かれてるわけね』
「そうそう、そういうこと。つまり、この値は実行ファイルをいくつ作って
もそれぞれ同じ、だけどひとつの場所じゃなくそれぞれ複製なんだってこと
に注意してね」
『なんか無駄って感じも』
「で、このアドレスの場所、つまりインスタンスハンドルの値、実はある程
度変えられるんです」
『へ？』
「デフォルトは 0x00400000 なんだけど、【プロジェクトの設定】ダイアロ
グの【リンク】−【アウトプット】のページを見て」
『むむ、難しそう……』
「この【アウトプット】ページの【ベースアドレス】に 0x410000 を入れて
OK で閉じてリビルドして」
『ほいほいほい。んで実行。あれ？』
「あ、インスタンスハンドルを見るならブレークポイントを置くか、最初の
方のプログラムでビルドするかしないと」
『さっきのに戻してビルドして〜っと、んで実行。お、インスタンスハンド
ルが 410000 になった！』
「複数実行すると」
『全部 410000 だ！』
「ってわけで、インスタンスハンドルはこういうふうに自由に変えることが
できるんです」
『自由って割りには…… 0x400001 じゃないの？』
「この値は 64 キロバイト単位でないといけない、っていう制限があるから
ね。実際に 0x400001 で試してみると」
『あ、無理矢理 0x410000 にされちゃった……』
「で、これをメモリウィンドウで見ると」
『うん、 0x00410000 から実行ファイルが置かれてる。その前は相変わらず
?? になってる』
「そう、その ?? も大事。【ベースアドレス】ってことは」
『アドレスの底、そっか、ここがアドレスの最初！』
「そうなんです。これ以前のアドレスは無効」
『無効？』
「ハードウェア上のメモリと違って、仮想メモリならこういうのは自由にで
きるからね」
『でもさ、それって逆じゃない？　仮想なら、どんなテキトーなアドレスで
もいいんだから、こんな無駄なことしなくても』
「うんうん、その辺は次回に続く！」
『続くんすか！？』

/*
    Preview Next Story!
*/
『なんかインスタンスハンドルの話、気合い入ってるね』
「これもメモリやポインタの話と関連してるからね」
『 C++ の難しいとこってよく言われるもんね〜』
「まぁ、簡単ってわけでもないけど」
『ってゆーか、ハードウェアのメモリって、見えないし』
「その辺は想像してもらうしかないけど」
『けど？』
「仮想メモリは見えるわけだから、その辺はしっかりとね」
『 VC のメリットってわけね』
「というわけで次回」
＜ Version 8.04 プロセスとインスタンスハンドル ＞
『につづく！』
「この辺は徹底的にやるからねー」
『でもちょっと食傷気味……』


////////////////////////////////////////////////////////////////////
/*                ２００２年２月２５日（月）の更新                */
http://www.kab-studio.com/

・更新なしの予定
　やや忙しい気味なので〜。その次の週は表紙壁紙だし。


////////////////////////////////////////////////////////////////////
/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.com/nikki2/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://backno.mag2.com/reader/Back?id=0000012198
http://www.kab-studio.com/Freeware/index.html#MailMagazine


////////////////////////////////////////////////////////////////////
/*
    KAB-studio.h
      Weekly Mail Magazine.
      Written by Kaburaya Seiden.
      http://www.kab-studio.com/Info/MailMagazine/

    (C)KAB-studio 1999 - 2002 ALL RIGHTS RESERVED.
        http://www.kab-studio.com/
        info@kab-studio.com
*/
////////////////////////////////////////////////////////////////////

