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

    KAB-studio.h


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

    送信日： 2004/05/10(Mon) No.256
    配信数： 2218 ( Mag2 + Pubzine )
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

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

・ほとはーに「 8-3 裏切り」追加！ ]
　三人合体ホットハーブに１話追加しました。
　今回は、やっと主人公登場。
[ 三人合体ホットハーブ ]
http://www.kab-studio.biz/Comic/HotHerb/index.html


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

2004/05/02 (Sun)
　２時から休出。今日は調子よかった。内容はいつも通りチューニング。修
正より説得。これからほとはー描きます。

2004/05/03 (Mon)
　なんとかほとはー描いて、えらい遠回りして、１時から１１時まで仕事し
て。明日は１０時出社、休出なのに……。

2004/05/04 (Tue)
　１０時からおしごと。でもお金入るからいっか。チューニング、限界？　
早くなるどころか……。１１時半までおしごと。責任あるのがキツイ……。
修羅の刻が悪すぎる……。明日の予定。

2004/05/05 (Wed)
　雨降ってたんで予定変更。ジャージとか買う。午後は CLANNAD をずっ
と。攻殻SAC2のＯＰ好き。コミックスはどうなん？　CLANNAD 感想。

2004/05/06 (Thu)
　久しぶりに仕事をした感じ。明日行けばお休み。絢爛舞踏祭は今クール
１番？　ゆめりあにオーディオコメンタリーが入ってることに気付く。バカ
万歳。 CLANNAD 感想。

2004/05/07 (Fri)
　第１次チューニング完了、まとめと第２次案作成、バグ取り。明日あさっ
ては２連休、その予定。ほとはー外伝２も描きたい。今度のコミケには
KAB-studio.ROM は出しません。

2004/05/08 (Sat)
　結局 CLANNAD しかしないし。光の玉ひとつと隠しシナリオを残すのみ。
家の近くの吉野家でも豚角煮きのこ丼導入。 CLANNAD 感想は日記にて。


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

■　第十章　剣と魔法　−５−

「残念ながら」
　とても残念そうではない顔で赤葉はそう言い、言葉を継ないだ。
「われわれの能力は体系立てられていないし、書き記されてもいない。我が
身に宿る力も、血と耳で受け継いだものだ」
　そして、大きくため息をつく。
「……だからといって、結白殿のすることに不満があるわけではないがな」
　と、嫌悪感を含んだ目で、メモを取る舞を見る。
「え、えーっと……昨日の夜、教わったこと思い出そうとしたら思い出せな
いことがあって、それで……」
「……書き記すことに注意を向けすぎなければ、よい」
「は、はい！」
　舞は真面目な顔ではっきりと返事をした。
「さて……術、とはいったいなにかの」
「術、ですか……？」
　何か、と訊かれると返答に困る。赤葉様の言葉で言うなら、私のは血に
頼った能力だし。
「率直なイメージとしては……魔法というより、超能力のような、直感的な
ものだと思います。少なくとも、私にとって、水を操るということはそうい
うことです」
「そうであろうな。私を含めて、泉を継ぐものは元々その能力を代々受け継
いでおる。炎を操る術は幼少より遣うことができた。しかし、それは術の本
質とは異なる」
　赤葉は手をかざし、唱える。
『朱き泉よ、我が意を汲みて力と成せ、黄の姿を増し、陽を凌ぐ力を見せ
よ！』
　人の言葉ではない、舞には解る呪文を唱えると、朱き泉の炎が黄色く瞬
いた。
「黄炎……」
                                                              (続く)


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

　Version 13.20
マージソート・汎用版

「前回はマージソートについて説明しました」
『でもクイックソートみたいにランタイムにないのは面倒よねー』
「というわけで、汎用的に使えるマージソートを用意しました」

// 配列の要素にする構造体。
struct SORT_DATA
{
    int m_iIndex;
    CString m_cDataStr;
};

// 比較用関数。
// p_pL > p_pR なら true を、
// それ以外は false を返すようにしてください。
bool CompareToForSORT_DATA( void *p_pL, void *p_pR )
{
    SORT_DATA *pstSortDataL = (SORT_DATA *)p_pL;
    SORT_DATA *pstSortDataR = (SORT_DATA *)p_pR;

    // 数値のみで比較します。
    if( pstSortDataL->m_iIndex > pstSortDataR->m_iIndex )
    {
        return true;
    }

    return false;
}

void DoMergeSort( SORT_DATA **p_ppstAry, int p_iSize )
{
    if( p_iSize <= 1 )
    {
        // 要素数が１以下なら何もしません。
        return;
    }

    // 中央から左側のサイズを取得します。
    int iLeftSize = p_iSize / 2;
    // 中央から右側のサイズを取得します。
    int iRightSize = p_iSize - iLeftSize;
    // 中央から左側のサイズの配列を作成します。
    SORT_DATA **ppstLeftAry = new SORT_DATA*[iLeftSize];
    // 中央から右側のサイズの配列を作成します。
    SORT_DATA **ppstRightAry = new SORT_DATA*[iRightSize];
    // それぞれコピーします。
    int iF1;
    for( iF1 = 0; iF1 < iLeftSize; ++iF1 )
    {
        ppstLeftAry[iF1] = p_ppstAry[iF1];
    }
    
    for( iF1 = 0; iF1 < iRightSize; ++iF1 )
    {
        ppstRightAry[iF1] = p_ppstAry[iLeftSize + iF1];
    }

    // それぞれ再帰呼び出しします。
    DoMergeSort( ppstLeftAry, iLeftSize );
    DoMergeSort( ppstRightAry, iRightSize );

    // マージします。
    int iLeftPos = 0;
    int iRightPos = 0;
    while(
        ( iLeftPos  < iLeftSize  ) || 
        ( iRightPos < iRightSize )
        )
    {
        // 左右両方とも配列の中にいる間、ループします。

        if( iRightSize <= iRightPos )
        {
            // 右側が配列の最後まで来ている場合。
            // 左側を追加します。
            p_ppstAry[iLeftPos + iRightPos] = ppstLeftAry[iLeftPos];
            ++iLeftPos;
        }
        else if( iLeftSize <= iLeftPos )
        {
            // 左側が配列の最後まで来ている場合。
            // 右側を追加します。
            p_ppstAry[iLeftPos + iRightPos] = ppstRightAry[iRightPos];
            ++iRightPos;
        }
        else if
            ( CompareToForSORT_DATA
                ( ppstLeftAry[iLeftPos]
                , ppstRightAry[iRightPos] 
                ) 
            )
          {
            // 左側の方が右側より大きい場合。
            // 右側を追加します。
            p_ppstAry[iLeftPos + iRightPos] = ppstRightAry[iRightPos];
            ++iRightPos;
          }
          else
        {
            // それ以外の場合（左側の方が右側より小さい場合）。
            // 左側を追加します。
            p_ppstAry[iLeftPos + iRightPos] = ppstLeftAry[iLeftPos];
            ++iLeftPos;
        }
    }

    // 解放します。
    delete[] ppstLeftAry;
    delete[] ppstRightAry;
}

『長い……けど、前とほとんど同じね。比較用関数が増えたくらい』
「使用例はこう」

void Use_DoMergeSort()
{
    SORT_DATA *ppstAry[5];
    ppstAry[0] = new SORT_DATA;
    ppstAry[0]->m_iIndex = 9;
    ppstAry[0]->m_cDataStr = "EEE";
    ppstAry[1] = new SORT_DATA;
    ppstAry[1]->m_iIndex = 3;
    ppstAry[1]->m_cDataStr = "DDD";
    ppstAry[2] = new SORT_DATA;
    ppstAry[2]->m_iIndex = 1;
    ppstAry[2]->m_cDataStr = "CCC";
    ppstAry[3] = new SORT_DATA;
    ppstAry[3]->m_iIndex = 3;
    ppstAry[3]->m_cDataStr = "BBB";
    ppstAry[4] = new SORT_DATA;
    ppstAry[4]->m_iIndex = 5;
    ppstAry[4]->m_cDataStr = "AAA";

    // ソートします。
    DoMergeSort( ppstAry, 5 );

    for( int iF1 = 0; iF1 < 5; ++iF1 )
    {
        TRACE
            ( "%d, %s\n"
            , ppstAry[iF1]->m_iIndex
            , ppstAry[iF1]->m_cDataStr 
            );
        // new で作ったので delete で解放します。
        delete ppstAry[iF1];
    }
}

「実行結果はこう」

1, CCC
3, DDD
3, BBB
5, AAA
9, EEE

『お、ちゃんと安定ソートになってる！』
「マージソートは安定ソートだから、構造体やクラスのソートに使うことが
多いと思って、今回は構造体を例にしてみました」
『でもこれって完全に汎用的、ってわけじゃないよね。 SORT_DATA のポイ
ンタのポインタが引数なんだから』
「そうだね、使う時にはちょっと修正が必要かな。でも比較用関数が」

bool CompareToForSORT_DATA( void *p_pL, void *p_pR )

『あ、 void ポインタだ』
「だから、この辺の型は気にする必要ないから。比較用関数の中身とか変え
れば何にでも使えると思うよ」
『比較用関数って、前に教わったのと同じ？』
「 Version 13.09 ( No.245 ) と同じ、左の方が大きければ true 、それ以
外は false 」
『 qsort() とは違うんだね』
「この比較用関数は、いろんなプログラムにあって、それぞれ仕様が違うか
らちょっと判りにくいかも。 qsort() の仕様に合わせるっていうのもあり
だと思うよ」
『他に違いってある？』
「他は前回と同じ。アルゴリズム自体同じだし、比較してる１箇所を比較用
関数に置き換えただけだし」
『そういえば、 qsort() みたいに void ポインタを受け取るっていうふう
にはできないの？』
「できなくはないけど、要素のサイズも渡さなきゃいけないし」
『あ、そっか』
「型が判れば、要素のサイズは渡さなくて済むからね。それに、そこまで汎
用化する必要はないかな、数カ所置き換えるだけで済むから」
『んーあと……比較用関数を引数に渡すってできる？』
「それは簡単にできるよ。まずアルゴリズムの引数を」

void DoMergeSort
    ( SORT_DATA **p_ppstAry, int p_iSize
    , bool ( *p_pfnComparetor)( void *p_pL, void *p_pR )
    )

「ってして、再帰呼び出し部分は」

    // それぞれ再帰呼び出しします。
    DoMergeSort( ppstLeftAry, iLeftSize, p_pfnComparetor );
    DoMergeSort( ppstRightAry, iRightSize, p_pfnComparetor );

「実際に比較用関数を呼んでいる箇所は」

        else if
            ( p_pfnComparetor
                ( ppstLeftAry[iLeftPos]
                , ppstRightAry[iRightPos] 
                ) 
            )

「ってすれば、あとは」

    // ソートします。
    DoMergeSort( ppstAry, 5, CompareToForSORT_DATA );

「でＯＫ」
『おー』
「このぐらい汎用化すれば、たいがいのことには使えるかな」

/*
    Preview Next Story!
*/
『この汎用ソートがあれば十分って感じよねー』
「というわけでソート編は次回で最後」
『早！』
「というわけで次回」
＜ Version 13.21 ソートのまとめ ＞
『につづく！』
「でもアルゴリズム編はまだ続くからねー」
『今回ももう２０回突破……』


////////////////////////////////////////////////////////////////////
/*                ２００４年５月１７日（月）の更新                */
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
*/
////////////////////////////////////////////////////////////////////

