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

    KAB-studio.h


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

    送信日： 2004/03/22(Mon) No.249
    配信数： 2290( Mag2 + Pubzine )
    発行元： まぐまぐ ( URL: http://www.mag2.com/  ID: 0000012198 )
*/
////////////////////////////////////////////////////////////////////

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

・ほとはーのつくりかた 「4. 主線」追加！
　ほとはーのつくりかたに「4.セリフ」を追加しました。
　メインの部分……だけど、だからあまり書くことないかも（汗）。そのか
わり「もののみかた」についてのコラムとか。
[ ほとはーのつくりかた ]
http://www.kab-studio.biz/Comic/HotHerbMaking/index.html


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

2004/03/14 (Sun)
　ぐだーっと。瓶詰妖精がかなり良かった。ほとはーのつくりかたにちょっ
と手間取る。引きこもりにならなかった理由。性格に問題有り。ダビングで
ＶＨＳ→ＤＶＤのコピーは結構きれい。ＤＶＤの方針。プラズマ欲しい。そ
して Oracle とオフショア開発。

2004/03/15 (Mon)
　朝から夜までミーティング。仕様とコードの比較。教えてせんせいさん。
司会者で決まる。ＨＤ・ＤＶＤデッキ本格使用開始。そして休出。

2004/03/16 (Tue)
　こつこつバグ取り。昔の小説を読む。アップルシード、フルＣＧ……。現
状。籍を置くＡ社、中間のＢ社、派遣先Ｃ社。さてどうなる？　そして土日
休出。

2004/03/17 (Wed)
　障害と質問がいっぱい。肩が痛い。ネギま！が面白い。お絵かきありがと
う！

2004/03/18 (Thu)
　午前中に Remember11 と CROSS†CHANNEL 購入。売れてたもの。データ
ベース入れ替えで再現したりしなかったり。今晩は Remember11 を。そして
派遣の期限。

2004/03/19 (Fri)
　体調最悪。腐ってたロジック。 ArrayList 使いまくり腐りまくり。９時
頃体調最悪。スピードワゴン優勝してくれ〜。 Remember11 感想。

2004/03/20 (Sat)
　午前中はほとはーのつくりかた。午後はバグの嵐。 ArrayList やら月や
ら close() してないやら ER 図が間違ってるやら。スピードワゴン優勝な
らず……。ビデオあまりきれいじゃない……。そして VC の案件。


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

■　第八章　朱と碧　−１４−

「あ”、あ”、あ”、あ”」
　声にならない声。額から流れる血を厭わず、汗まみれ泥まみれの服も厭わ
ず、ただ、頭蓋の奥底の異物感にもがき続けている。
　周囲を包む森。起伏の激しい道。大気は皮膚を蝕み、気分を害する。
「がっ！」
　行雄は飛び上がり、木々を突っ切って森の上へと出る。衛星写真を元に作
られた地図と比較し、正しい道を探す。見つけてから、再び木々の中へと落
ちる。枝が服を切り裂く。
　地面に着地しても、すぐには起きあがれない。揺さぶられた脳が、意識を
掻き乱す。
「う”、う”」
　思わず両手で頭を掻きむしる。硬化した左腕が顔面を削る。
「あ”、う”」
　痛みは、感じない。
　傷は、それ以上深くならない所まで刻まれていた。骨を覆う、皮膚でも筋
でもない、何か。人の体ではあり得ない色。掻きむしるたびに、それが露わ
になる。
「ったく、ひでぇな」
　岩の上から見下ろす雅樹は、嘲りとも罵りとも取れる声音でそう言い切っ
た。
　その声は、行雄の癇に障った。
　風を切る音よりも早く迫り硬化した左腕で薙ぐ。そのままの勢いで木々の
上まで飛び上がる行雄を、一歩飛びずさった雅樹が見上げる。
「おいおい、コントロールくらいしろよ」
　だが今の、早かったな……俺が来て正解だったな。舞だったら隙を見せて
いたかもしれない。
　行雄が木々の上へと上がり、姿が消える。が、雅樹は
「ＯＫ」
　と言い、確信を持って移動する。そして、大きく刀を振りかぶる。
　振りかぶる先に、行雄が降りた。
                                                              (続く)

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

　Version 13.13
ポインタ用コレクション

「前回は CStringArray について見てみました」
『でもコレクションってこれだけじゃないんだよね』
「そうなんだけど……構造体とかでコレクションを使う時にはちょっと難し
くなるかな」
『どういうこと？』
「まず、 CStringArray みたいに、特定の型のコレクションが用意されてい
るのは珍しいこと。普通のクラスには、専用のコレクションクラスなんてあ
りません」
『そりゃそうよね。それほどすごい数のコレクションクラスが必要になっ
ちゃうもの』
「でも、コレクションクラスでどんな型でも扱えるようにするためには一工
夫必要になるんです。型が違うとコンパイルエラーが出るから」
『そういえば……ってゆーか、どんな型でも、っていうの無理じゃない？』
「無理でもないよ。ひとつは、【テンプレート】っていうものを使う方法」
『テンプレートって、なんかの元になるってゆーか、使い回しにするものっ
てゆーか』
「そう、そのテンプレート。テンプレートを使うとどんな型にでも使えるよ
うになります。実際、 MFC の CArray とかはテンプレートの機能を使って
ます。だけど……」
『だけど？』
「上級者向けで、ちょっと簡単には使いにくいかな」
『えー？』
「というわけで、もうひとつの方法として、ポインタを使う方法を紹介しま
す。 void ポインタって憶えてる？」
『 Version 7.04 ( No.124 ) でやったね。どんなポインタでも……あ、
そっかそれならどんな型でも使えるね』
「そういうこと。使用例を含めて、まとめて見てみようか」

// 配列の要素にする構造体。
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;
    }
    else if(
        ( pstSortDataL->m_iIndex == pstSortDataR->m_iIndex ) &&
        ( pstSortDataL->m_cDataStr > pstSortDataR->m_cDataStr )
        )
    {
        // 数値は一致。
        // 文字列は左の方が大きいです。
        return true;
    }

    return false;
}

void DoBubbleSortToCPtrArray( CPtrArray &p_rcPtrAry )
{
    // 「入れ替え先」のループです。
    for( int iOut = 0; iOut < p_rcPtrAry.GetSize() - 1; iOut++ )
    {
        // 最後から先頭方向へのループです。
        // ただし「入れ替え先」までです。
        for( int iIn = p_rcPtrAry.GetSize() - 1; iOut < iIn; iIn-- )
        {
            if( CompareToForSORT_DATA
                    ( p_rcPtrAry.GetAt( iIn - 1 )
                    , p_rcPtrAry.GetAt( iIn )
                    )
                == true )
            {
                // 前の方が大きいので入れ替えます。
                void *pcTemp = p_rcPtrAry.GetAt( iIn );
                p_rcPtrAry.SetAt( iIn, p_rcPtrAry.GetAt( iIn - 1 ) );
                p_rcPtrAry.SetAt( iIn - 1, pcTemp );
            }
        }
    }
}

// 使用例。
void Use_DoBubbleSortToCPtrArray()
{
    CPtrArray cPtrAry;
    SORT_DATA *pstSortData;
    
    pstSortData = new SORT_DATA;
    pstSortData->m_iIndex = 9;
    pstSortData->m_cDataStr = "EEE";
    cPtrAry.Add( pstSortData );
    pstSortData = new SORT_DATA;
    pstSortData->m_iIndex = 3;
    pstSortData->m_cDataStr = "DDD";
    cPtrAry.Add( pstSortData );
    pstSortData = new SORT_DATA;
    pstSortData->m_iIndex = 1;
    pstSortData->m_cDataStr = "CCC";
    cPtrAry.Add( pstSortData );
    pstSortData = new SORT_DATA;
    pstSortData->m_iIndex = 3;
    pstSortData->m_cDataStr = "BBB";
    cPtrAry.Add( pstSortData );
    pstSortData = new SORT_DATA;
    pstSortData->m_iIndex = 5;
    pstSortData->m_cDataStr = "AAA";
    cPtrAry.Add( pstSortData );

    // ソートします。
    DoBubbleSortToCPtrArray( cPtrAry );

    for( int iF1 = 0; iF1 < cPtrAry.GetSize(); ++iF1 )
    {
        pstSortData = (SORT_DATA *)cPtrAry.GetAt( iF1 );
        TRACE
            ( "%d, %s\n"
            , pstSortData->m_iIndex
            , pstSortData->m_cDataStr 
            );
        delete pstSortData;
    }
}
/*
実行結果：
1, CCC
3, BBB
3, DDD
5, AAA
9, EEE
*/

「まず使用例から見てもらおうかな」

    pstSortData = new SORT_DATA;
    pstSortData->m_iIndex = 9;
    pstSortData->m_cDataStr = "EEE";
    cPtrAry.Add( pstSortData );

『構造体 new して、そこにデータ入れて、んで CStringArray みたく 
Add() 、だよね』
「そう。基本的にコレクションクラスのメンバ関数はどれも同じ。だから、
ひとつ憶えれば他にも使えるかな」
『 GetSize() とか GetAt() 、 SetAt() もそうだね。それにしても……
やっぱり new しなきゃいけないんだ』
「ポインタを扱うクラスだからね、それは避けられないかな」
『ちょっと面倒かも……』
「次にソート本体」
『最初の for ふたつは前回と同じね。比較するところは……あ、関数がか
なり変わってる』
「今回は、構造体のポインタをまるごと受け取るようにしました」
『なんかかなり違う……』

bool CompareToForSORT_DATA( void *p_pL, void *p_pR )

『って、いきなり引数 void ポインタだし』
「これは意味があるんです。 DoBubbleSortToCPtrArray() を見てみて。
SORT_DATA や、そのメンバの m_iIndex や m_cDataStr って出てないで
しょ」
『そういえば』
「つまり、 DoBubbleSortToCPtrArray() はソート対象の各要素がどんな型
でも使えるってこと」
『あ…… void ポインタで扱ってて、キャストしたり、その中身にアクセス
したりしてないから？』
「そういうことで、そのアクセスしたりとかキャストしたりとかを、比較関
数、つまり CompareToForSORT_DATA() でしてるんです」
『……それに意味が？』
「 CompareToForSORT_DATA() を変えるだけで、どんな型でもＯＫでしょ」
『あ、なるほど』
「これはあと何回かしたら教える qsort() っていう関数のところで出てく
るから、ちょっと頭の隅に憶えておいて」
『はーい』
「では比較関数について。今回ちょっと違う比較方法にしてみました」
『２段階に比較してるね』

    // 数値で比較します。
    if( pstSortDataL->m_iIndex > pstSortDataR->m_iIndex )
    {
        return true;
    }
    else if(
        ( pstSortDataL->m_iIndex == pstSortDataR->m_iIndex ) &&
        ( pstSortDataL->m_cDataStr > pstSortDataR->m_cDataStr )
        )
    {
        // 数値は一致。
        // 文字列は左の方が大きいです。
        return true;
    }

    return false;
}

『 m_iIndex と m_cDataStr の両方を比較してるんだ』
「まず m_iIndex で比較して、同じなら m_cDataStr で比較。検索結果もそ
うなってるでしょ」
『 3 のところ、 BBB が上に来てる』
「安定ソートだから、もし m_cDataStr で比較していなかったら、元の順番
通り DDD が上に来るはずだからね」
『こういうソート方法もあるってことね』
「この辺は実際に使いたい機能によって色々変えてみてください」

/*
    Preview Next Story!
*/
『なんか今回は実用的！』
「構造体で可変長、っていうのはよくあるからね」
『こういう実用的なのばっかりだといいなー』
「う”」
『なによ、う”って』
「というわけで次回」
＜ Version 13.14 リストのしくみ ＞
『につづく！』
「このリスト、ソートには向かないんです……」
『さっそくかい』


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

・ほとはーのつくりかた 「5. 着色」追加予定
　ほとはーのつくりかたに「5.着色」を追加予定。
　一番省力化を徹底している箇所なので色々参考になるかも。


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

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
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
*/
////////////////////////////////////////////////////////////////////

