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

    KAB-studio.h


    (C)KAB-studio 1999 - 2004 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz

    送信日： 2004/04/19(Mon) No.253
    配信数： 2219 ( Mag2 + Pubzine )
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////
/*                ２００４年４月１９日（月）の更新                */
http://www.kab-studio.biz/index.html

・４月表紙壁紙！
　お休み……なんてとんでもない！　というわけで４月表紙壁紙を追加しま
した！
　ダウンロードは CG Gallery にて。表紙からリンク張ってないのは……い
や……ね……。
[ CG Gallery ]
http://www.kab-studio.com/CG/Gallery/index.html


////////////////////////////////////////////////////////////////////
/*                        ちょお普通な日記                        */
http://www.kab-studio.biz/nikki2/index.html

2004/04/11 (Sun)
　Remember11 クリア。良かったけど Ever17 ほどではなかったかも。来週
はほとはーないです。 Remember11 の感想は日記にて。

2004/04/12 (Mon)
　８時半に派遣先に行って席替え。お昼に客先へ。すごい眠い。いいのは
せんせいのお時間、良くないのは爆裂天使。夏コミの受付確認ハガキ来た
る。

2004/04/13 (Tue)
　気付いたら朝１１時。そのまま休みました。そして寝まくり。ホントに眠
い。ぱにぽにドラマＣＤ２巻、アニメで見たい……。

2004/04/14 (Wed)
　昨日しっかり寝たのに今日も眠かった。引きつづきバグ潰し。おねつい
ＤＶＤとアマゾン。

2004/04/15 (Thu)
　最短経路を目指すべきなのに遠回りをしたくなっちゃう。わては一般的な
エンジニアじゃない？　営業さんとかの方が大変そう。サクサクが面白い。

2004/04/16 (Fri)
　１７日午後１１時。昨日の仕事はバグ潰し。デグレードが……。そのあと
飲みに行って、んで徹ゲー。今回はあまりせず？　６時半に帰って４時間寝
る。明日の予定。

2004/04/17 (Sat)
　２時から休出。やっぱり眠かった。ネギマ！とか購入。美鳥の日々は
ＤＶＤ購入決定。Ｎスペ・地球大進化がかなりいい感じ。これまでのＮスペ
の中で一番良かったものは。今日明日の予定。


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

■　第十章　剣と魔法　−２−

「……」
　ため息混じりに黙り込んで、木に寄りかかる。そして雅樹をいじけるよう
に睨む。
「……その理由は？」
「舞はな、相手の出方を見過ぎるんだ」
　雅樹も剣を地面に刺し、木に寄りかかる。
「正しく言うとだな、おまえは遠距離戦の感覚で近距離戦をしている」
「そんなこと」
「してないっていうんなら、それは近距離戦を甘く見過ぎているんだ。反射
神経、判断の速さ、そういったもんが遠距離戦の域を出ていない」
「つまり、もっと速くしろ、ってこと？」
「できるか？」
「……」
　舞の顔は、悔しそうに『ちょっと無理』と語っていた。
「遠距離戦は敵の攻撃が自分に届くまで時間がある。舞はそれを見て、判断
して、それを上回る力でねじ伏せたり、躱してさらに速い攻撃を返すことが
できる。だが接近戦は別だ。少ない情報でとっさに判断する必要がある」
「でも、失敗したら斬られるんじゃない」
「だから安全策を取る。情報が多ければ確実な攻撃を行う」
「情報量に応じて行動しろってこと？」
「そういうことだ。俺が踏み込んだら同時に下がる、くらいでいい」
「……」
　舞が不意に踏み込む。雅樹が刀を斜めに構える。
「……雅樹は下がらないじゃない」
「あのなぁ……」
                                                              (続く)

////////////////////////////////////////////////////////////////////
/*                       #pragma twice                            */
http://www.kab-studio.biz/Programing/PragmaTwice/index.html

　Version 13.17
ランタイムでクイックソート

「前回は、クイックソートする関数を作ってみました」
『再帰呼び出ししててちょっと複雑だったかも……』
「さて、実はあの関数は必要ありません」
『ええっ？』
「クイックソートは、専用の関数がランタイムに用意されてるからです」
『え”、なに無意味？』
「アルゴリズムの勉強だから無意味じゃないんだけど……」
『でもなんか無駄〜』
「でも、仕組みがわからなきゃ安定ソートじゃないとかの理由がわからない
でしょ」
『う”』
「だから、実際に作ってみることが必要ってこと」
『うー』
「さて、ではこれからランタイムのクイックソート用関数 qsort() を使っ
てみます」
『 qsort() 、そのままね』
「ちなみにクイックソート以外のソート関数は用意されてません」
『げ、じゃあ安定ソートできないじゃん』
「なんだよね。だからこれもあまり使う機会ないかも。まぁそれは置いとい
て、まずは使ってみましょう」

// 比較用関数。 int で比較します。
// 左の方が小さければマイナス、
// 同じであれば 0 、
// 左の方が大きければプラスを返します。
int CompareTo( const void *p_pvL, const void *p_pvR )
{
    return *( (int *)p_pvL ) - *( (int *)p_pvR );
}

void Use_qsort()
{
    int iAry[5];
    iAry[0] = 4;
    iAry[1] = 9;
    iAry[2] = 3;
    iAry[3] = 5;
    iAry[4] = 8;

    // ソートします。
    qsort( iAry, 5, sizeof( int ), CompareTo );

    for( int iF1 = 0; iF1 < 5; ++iF1 )
    {
        TRACE( "%d ", iAry[iF1] );
    }
    TRACE( "\n" );
    // 3 4 5 8 9 
}

『うわ、みじか！　ん、でも比較用関数は必要なんだ』
「そう、 Version 13.09 ( No.245 ) のときみたいに。でも微妙に違うで
しょ」
『……引数が void ポインタで、戻り値が int ……』
「 qsort() を使う上で、色々なルールがあるから、まずそのあたりをひと
つずつ押さえていきます。まずは呼び出している箇所から」

    // ソートします。
    qsort( iAry, 5, sizeof( int ), CompareTo );

「第１引数は配列、第２引数はその配列の要素数、第３引数はその要素のサ
イズ、第４引数は比較用関数へのポインタ」
『要素数とサイズ、両方渡すんだ』
「これは qsort() の引数を見た方が早いかな」

void qsort
    ( void *base
    , size_t num
    , size_t width
    , int (__cdecl *compare)(const void *elem1, const void *elem2) 
    );

「第１引数が void ポインタだから、各要素のサイズがわからないと〈次の
要素〉が見られないから」
『そか、今までのソートって普通の型の配列だったから、要素のサイズって
わかってたけど、 qsort() は void のポインタだから……って、なんで 
void ポインタなの？』
「そうじゃなきゃいろんな型が使えないでしょ」
『あ、 CObArray と同じね』
「そういうこと。 void ポインタは〈汎用型〉として使えるから便利なんだ
よね。その分、危険なんだけど」
『だよねー、型間違えたらエラーだし、コンパイルしたときにはわからない
し……』
「さて次に、比較用関数について」
『なんかややこしい引数だね』

    , int (__cdecl *compare)(const void *elem1, const void *elem2) 

「この引数は、【関数ポインタ】を引数として受け取るときの書き方」
『かんすうぽいんた？　そういえばアルゴリズムの最初の時に言ってたね』
「そう、この方法を使うと関数をとっかえひっかえできるから、アルゴリズ
ムには便利なんです」
『確かに、引数として渡せると便利ね……』
「じゃあ、この関数ポインタの見方について」

    戻り値 (呼出方 *変数)(引数) 

「という書式になっています」
『？』
「そうだね、普通に変数として使ってみようか」

void FunctionPointer()
{
    // 関数ポインタ。
    int (__cdecl *fp)(const void *elem1, const void *elem2);
    fp = CompareTo;

    int i50 = 50;
    int i100 = 100;
    // 関数ポインタ経由で呼び出し。
    TRACE( "%d\n", fp( &i50, &i100 ) );
    TRACE( "%d\n", fp( &i100, &i100 ) );
    TRACE( "%d\n", fp( &i100, &i50 ) );
    // -50
    // 0
    // 50
}

『んと、つまり fp って変数を作ってるってこと？』
「そういうこと。 CompareTo() の関数のアドレスを入れる変数 fp を作っ
て、その中に関数のアドレスを入れると、 fp が CompareTo() の代わりに
なるんです」
『ほほう、これを使えば、どの関数を呼ぶか、っていうのを引数で変えられ
るわけね』
「そういうこと。関数ポインタを直に扱うのは危険だからあまり使いすぎな
い方がいいけど、こういう方法もあるってこと」
『確かに便利は便利ね』
「ちなみに、火美ちゃんはこれまでになんども関数ポインタを使ったことが
あるんです」
『え”？　全然憶えないんだけど』
「ウィンドウプロシージャやダイアログプロシージャ」
『あ……あ！　そっか、あれって関数ポインタを渡してたんだ！』
「 Version 8.07 ( No.149 ) の」

    int iRet
        = DialogBox
            ( p_hInstance
            , MAKEINTRESOURCE( IDD_MAIN )
            , NULL
            , DialogProc
            );

「は、 DialogProc っていう関数ポインタを引数として渡していたんです」
『そうするとメッセージが来たら DialogProc() 呼んで渡す、ってできるも
んね。なるほどねー』
「 qsort() もこのウィンドウプロシージャも、関数の中から呼ぶ関数のポ
インタを渡すしてるでしょ」
『ややこしい……』
「関数ポインタの主な使い道がこれかな」
『他に使い道あるの？』
「配列に入れて立て続けに呼び出すとか」
『う”、なんか危険な香りが……』
「まぁね、実は C++ では【ポリモーフィズム】っていうのがあって、同じ
ような機能をもっと安全に使う方法があるから、最近はあまり使わないか
な」
『ポリモーフィズム、よく聞くけど……』
「ま、説明は今度ね。さて、話を戻して、今度は比較用関数そのものを見て
みます」

// 比較用関数。 int で比較します。
// 左の方が小さければマイナス、
// 同じであれば 0 、
// 左の方が大きければプラスを返します。
int CompareTo( const void *p_pvL, const void *p_pvR )
{
    return *( (int *)p_pvL ) - *( (int *)p_pvR );
}

『今までと戻り値と引数の型が違う！』
「引数の void ポインタは説明したでしょ」
『 Version 13.13 ( No.249 ) の？』
「そう、それと同じ。 void ポインタで受ければどんな型にでも使えるか
ら」
『ん？　それって qsort() の第１引数と同じ理由？』
「同じ理由。 qsort() っていうひとつ関数でどんな型でも扱えるようにす
るには、 void ポインタが一番簡単だからね」
『でも危険、と』
「そういうこと」
『戻り値が int なのはなんで？』
「比較方法がそうだから。〈より大きい〉と〈より小さい〉が必要だから」
『だから３つに分けてるわけね。でも…… if 使ってないね』

    return *( (int *)p_pvL ) - *( (int *)p_pvR );

『こんなんでいいの？』
「〈プラス〉と〈マイナス〉って、正確な数は決めてないから」
『あ、そういうえば…… 1 も 100 も同じ？』
「そういうこと。だから単純に引き算すればいいだけ」
『そうすれば、左が大きければプラス、小さければマイナス、同じなら 0 
ってなるわけね、なるほど』
「ちょっとわかりにくいから、丁寧に書いてもいいかもね。ではまとめ。
qsort() はこんなに簡単に使えます」
『ホント、簡単ね……』
「なので、クイックソートをする場合には qsort() を使いましょう」
『はーい』
「さらに言えば、安定ソートをしない場合には qsort() を使いましょう」
『最速だもんね』
「そういうこと。あるものをできる限り使うのが一番だからね」

/*
    Preview Next Story!
*/
『やっぱランタイムがあると簡単ねー』
「さて、次回はマージソートの説明をします」
『ランタイムある？』
「ありません」
『というわけで次回』
＜ Version 13.18 一番便利・マージソート ＞
「につづく！」
『ランタイムないといやー！』
「でも、僕が関数の例を作ってあげてるんだけど……」
『あ、そっか』


////////////////////////////////////////////////////////////////////
/*                ２００４年４月２６日（月）の更新                */
http://www.kab-studio.biz/index.html

・ほとはーに１話追加予定 ]
　長らくお待たせしました！　ほとはーが再開します！　今回は新キャラ…
…っぽいキャラが登場します。お楽しみに！！


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

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


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

    (C)KAB-studio 1999 - 2004 ALL RIGHTS RESERVED.
        http://www.kab-studio.biz/
        info@mail.kab-studio.biz
*/
////////////////////////////////////////////////////////////////////

