{magclick}
{magclick}
/*
    KAB-studio.h
        　ＫＡＢ−ｓｔｕｄｉｏで先週更新した内容
        が格納されたヘッダーファイルです（笑）。

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

    送信日： 2000/08/28(Mon) No.071
    配信数： 3820（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/
{magclick}

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

・表紙をリニューアル
　表紙をちょっとだけ変えました。たぶん、新しいイラストが大きいのがえ
らい不評だと思う（爆）。あとニュースを表紙に書くようにしました。ニュー
スのページはヒット数少なかったので（汗）。
　
・祝２０万ヒット＆５周年
　ＫＡＢ−ｓｔｕｄｉｏは２０００年８月２３日に２０万ヒットを達成しま
した！　さらに、２０００年７月で５周年を迎えました。まぁホームページ
は死ぬまで続ける気なんで、その前にまずは目指せ１００万ヒット！
　ちなみにカウンターは、表紙の一番下に移動しました（汗）。かなり見に
くいんでご注意を。

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

2000/08/20 (Sun)
　なんもせずにのんびりテレビ見たり。そして ToHeart やったことのない
人。話に乗れない（泣）。

2000/08/21 (Mon)
　横浜へ〜。やっぱテレビの広告効果ってのは絶大だねぇ。そして曜日ずれ。
全然気付かんかった……。

2000/08/22 (Tue)
　デ・ジ・キャラットサマースペシャル２０００前半！！　でじこ〜！！
新表紙描き途中経過。今回のはやっぱアレかねぇ。

2000/08/23 (Wed)
　まず薬を取りに行き、デ・ジ・キャラットサマースペシャル２０００後半
を見て、さらに新表紙描き、とどめに調布まちづくりの会。久々のハードス
ケジュールである。

2000/08/24 (Thu)
　JSD さんの方へ遊びに。色々聞けた……でも書けない（爆）。久々秋葉原
は収穫なし。新宿で CD-RW ドライブ購入（爆）。やっと買った〜。これで
ホームページやＣＧをバックアップにょ。

2000/08/25 (Fri)
　新表紙完成！　しかし出来は……。 R 焼きは安定。それより Zip がやば
い（汗）。プログラミング辞書は結構大変……。

2000/08/26 (Sat)
　ドラクエ買った（爆）。自分でも買うとは思わなかったのに……。あと
ホームページリニューアル前の準備とか。ゲームは時間を食う……。


/*                         鏑矢の憂鬱                             */
http://www.kab-studio.com/Programing/KabuU/

2000/08/20 (Sun)
お休み

2000/08/21 (Mon)
お休み

2000/08/22 (Tue)
お休み

2000/08/23 (Wed)
お便り
動的メニュー追加とアクセラレーター
アクセラレーターが効かない
時間がなかった
コマンドＩＤが同じかどうか
メニューの「 Ctrl+X 」とかは自動的には書き込まれない

2000/08/24 (Thu)
お便り
動的メニュー追加とアクセラレーター続き
昨日のは大丈夫
アクセラレーターテーブルの追加
サンプルコード
TranslateAccelerator() をなんとかしないとダメ
MFC にその機能が備わっている
CDocument::GetDefaultAccelerator() をオーバーライドする
この戻り値を TranslateAccelerator() に渡してくれる

2000/08/25 (Fri)
昨日の続き
メニューの動的追加
Codian の方法と同じ
オーバーライドの解説
CDocument::GetDefaultAccelerator() と TranslateAccelerator() 
サンプルコード
ソースコード見ないと分からない仕組み

2000/08/26 (Sat)
お便り
cout を Label や Edit に出力したい
BCB5 持ってないから Label や Edit が分からない
char 配列にコピーできれば大丈夫かな？
std::strstream を使えばいい
サンプルコード
これが cout の代わりに使える
STL & iostream 入門のコードを流用


/*             プログラミング辞書・今週の追加単語                 */
http://www.kab-studio.com/Programing/Dictionary/

・追加単語：
DDE プリエンプション プリエンプティブ DIID コネクションポイント
シンク 親ウィンドウ トップレベルウィンドウ 抽象化 抽象化レベル
WAV コモンコントロール ツールバー ツールバーコントロール
更新 ファイバ コンソールバッファ バッチ Autoexec.bat 
クライアント領域 クライアントウィンドウ チャンク Perl 
ユーザーインターフェイス 

・今週のごめんなさい
DLL フリースレッドマーシャラ Launch as Interactive イテレーター 
デスクトップ エディットコントロール COM endian システムフック
TabCtrl イベントログ 親 ファイルパスの取得 セマンティック
ビットフラグ ラスタ処理 ビットマップ マーシャリング volatile
ミューテックス クラス toolbar LVS_EX_TRACKSELECT ＶＳＡＭ編成
再描画と更新の違い ロードモジュール キャレット アップキャスト
プロクシ ポインタ

・今週の状況：
　最近の流行は COM みたいです（汗）。難しい……。あと「複合語」も多
くて手強いです。複合語は下手するといっぺんに３つくらい単語を追加しな
きゃいけないから。ま、今週は忙しかったからそれで大変だったんで、いつ
もなら問題なしですな。


{magclick}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『あー、もうすぐ STL （略）入門終わっちゃう』
「大丈夫、再放送するから」
『さいほぉうそぉう？？』
　再放送が待てないあなたは購読登録。
http://www.kab-studio.com/Programing/STLiostream/
_______________________________________________________________[KCM]
{magclick}


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

　Version 5.06
文字列とポインタ

「まず、前回最後に見た」
『あたしが作った関数を見てみてみてーっ！！』

void GetLengthWithIndex()
{
    char chAry[] = "ABC";
    for( int iNo = 0; ; ++iNo )
    {
        if( chAry[iNo] == '\0' )
        {
            break;
        }
    }
    TRACE( "%d\n", iNo );
    // 3
}

『どう、どうどう？』
「うん、悪くないよ。でももう少し良くできるかな？」
『良くできる？』
「たとえば、 chAry の中身って書き換えないでしょ」
『あー、そういえばそうね。文字の数数えるだけだもん』
「そういう場合は const にすれば、間違って書き換えることがなくなるか
ら」

    const char chAry[] = "ABC";

『うお、 const が付くと難しそう！』
「 const char の配列、って考えれば大丈夫でしょ。 const char は？」
『 char の値変えられないの。ってことは、 chAry[0] とかがそれぞれ変え
られないってことだね』
「そうそう。 const にしておけば」
『書き換えようとしたらエラーになるんだもんね』
「そうそう。さらにもう一歩進めてみようか」
『もう一歩？』
「ここでは "ABC" って直接書いてるけど、これを関数の引数として受け取
るようにすると、他でも使えるようになるでしょ」
『他って？』
「ひとつのプログラムの中で、 ABC の長さだけ調べるってことはないでしょ。
プログラムのいろんな所から、いろんな文字列の長さを調べられるようにす
れば」
『それは便利だよね。んっと、引数でってことは……』

void GetLengthWithIndex( const char p_chAry[] )

『みたいな？』
「違うんだよねー。基本的に、配列は引数にできないって考えた方がいいか
も」
『どして？』
「呼び出すたびに、配列の長さが違うでしょ。配列ってそういうふうにフレ
キシブルに使えないんだよね」
『使いづらいってことなんだ』
「その代わりに、ポインタを使います。配列から [] を取ると？」
『ポインタになる！』
「だから」

void ArrayToPointer()
{
    const char chAry[] = "ABC";
    const char *pch = chAry;
    TRACE( "%s\n", pch );
    // ABC
}

「ってことができます」
『 const char の配列から [] を取ると const char のポインタになるんだ
ね。……あーっ！！』
「な、なに？」
『だから sizeof ダメって言ったんだ！！』
「そういうこと。文字列を関数に渡すときとかはポインタで渡すからね、
sizeof は使えないわけ」
『ほー。ってことは』

void GetLengthWithIndex( const char *p_pch )

『にすればいいのかな。で、中身の chAry を p_pch にすればいいんだね』
「そうそう」
『あ、でも待って！　これじゃ』

    GetLengthWithIndex( "ABC" );

『ってできないじゃん！！』
「いや、これができるんだよね」
『へ？』
「この辺がややこしくて複雑なんだけど、 "" で囲んだ文字列って、 char 
のポインタ型なんだわ」
『あ、だからこれもＯＫなの？』
「そう、さらにこれもＯＫ」

void StringPointer()
{
    const char *pch = "ABC";
    TRACE( "%s\n", pch );
    // ABC
}

『ええっ！？　な、なんか変くない？　だってさ、配列の時は、配列の char
ひとつひとつに文字入れたけど、これだと、どっかにある "ABC" ってポイ
ンタ使うだけだから、なんか……』
「うん、言いたいことは分かるよ。これは "ABC" がどうなってるか、が鍵」
『うん、どーなってるの？』
「 "" で囲んだ文字列とか、直に書いた 100 みたいな数字とかを〈リテラル〉
って言います」
『あ、 Ver 4.09 ( No.059 ) でやったね』
「リテラルもコンピューター世界のものだから、当然メモリに置かれるで
しょ。 "ABC" も、そんな感じにメモリ上に置いてあるわけ」
『だからアドレスもあるから、そのポインタもあるってことなんだ！』
「そういうこと。しかーし！　これはダメ」

void ArrayToPointerBad()
{
    const char *pch = "ABC";
    const char chAry[] = pch;
    // error C2440: 
    // 'initializing' : 'const char *' から 'const char []' 
    // 変換することはできません。
    // この変換が可能なコンテキストはありません。
}

『ええっ！？　だって "ABC" はポインタなんでしょ？』
「複雑でしょう。さっきも言ったけど、配列ってフレキシブルにできてない
んだよね。配列のサイズを決めるときに、 "ABC" だと４つって決められる
んだけど」
『ポインタだと決められない？』
「そ。この辺はコンパイラとかのこと知らないと分かんないよね」
『ってゆーかコンパイラ知らない』
「だね。この辺も、ポインタ難しいって言われる原因かな」
『この前水希ちゃんも言ってたけど、結局配列が難しいんだよね』
「そういうことになるかも。ま、先に進むと配列使うこと少なくなるし。話
を戻すと？」
『あ、関数作ってる途中だったんだよね。結局、引数はポインタにすればい
いんだよね』
「そうそう。あともうひとつ変える部分。文字数を TRACE() でアウトプッ
トに出してるけど、これを戻り値として返すとすると？」
『すると』

int GetLengthWithIndex( const char *p_pch )

『みたいになるんだよね。そうなると……』

int GetLengthWithIndexNew( const char *p_pch )
{
    for( int iNo = 0; ; ++iNo )
    {
        if( p_pch[iNo] == '\0' )
        {
            break;
        }
    }

    return iNo;
}

『って感じになって、使うと……』

void UseGetLengthWithIndexNew()
{
    TRACE( "%d\n", GetLengthWithIndexNew( "ABC" ) );
    // 3
}

『おお、なんかうまくいった！』
「これで、 GetLengthWithIndexNew() は〈文字列の長さ〉を調べる関数に
なったから、何か他の所から使いたい場合でも」
『これ呼び出せば文字列の長さ分かるんだ。 "ABC" とかやってたらそーゆー
のダメだったもんねー』
「こんな感じに、外からデータを受け取って、中で処理して、結果を返す」
『文字列受け取って、長さを返す』
「そういうのが関数の一番基本的な形式。こういうふうに、関数の〈入力〉
と〈出力〉を考える事を〈設計〉って言います」
『設計、なんか建築用語みたい』
「実際そんな感じだね。今回は引数少ないからいいんだけど、引数が増えて
くると、どういう風に引数を取るかとかが結構重要」
『どんなふーに？』
「それはまた今度」
『ぶー』
「そういう、関数の外の面に対して、中の部分を〈実装〉って言います。最
近は英語で〈インプリメント〉って言う方が多いかも」
『あの宇宙人がやってくってゆー』
「？」
『いや、なんでもないっす。で、設計と実装って別々なの？』
「それが理想。まず関数やクラスの設計だけして、そのあとその中身を実装
する、っていうのが理想的な方法だね」
『確かに家作るときってそう作るよね……』
「ちなみに、中の実装を〈プログラミング〉じゃなく〈コーディング〉って
呼んだりします」
『あ、コーディングって良く聞く言葉！　つまり関数の中身書くことをコー
ディングって言うんだ』
「一応ね」
『一応？』
「なんかプログラム書くこと、つまりプログラミング＝コーディングって使
われてることもしばしば」
『じゃー意味ないじゃん』
「音的に、プログラミングよりコーディングの方がかっこいいってことなの
かなぁ」
『さて！』
「今火美ちゃんは、関数を作ったわけだ。でも、関数を作る上で最も重要な
ことがあります！」
『最も重要なこと！？　そ、それは？』
「もう誰かが作っているのなら、自分は作らないこと」
『へ？』
「これを見て」

void ReplaceTo_strlen()
{
    TRACE( "%d\n", strlen( "ABC" ) );
    // 3
}

『……ああっ、 strlen() ってなに？　これがあるからあたしの関数は要ら
ないの！？』
「というわけでつづく！」

/*
    Preview Next Story!
*/
『あ”あ”〜、私の苦労はいったい！？』
「でもその苦労は無駄にはならないよ」
『けっ、そんな気休め要らないわい！』
「そうじゃなくって、ちゃんと勉強になる苦労をさせてあげたんだよ」
『そ、そなの？』
「というわけで次回」
＜ Version 5.07 C ランタイムライブラリ ＞
『につづく！』
「僕なんか、どれだけ意味のない苦労をさせられてきたか……」
『はいはい、ありがとうねー、もう……』


/*                       金菜さんの憂鬱                           */
http://www.kab-studio.com/Programing/KanaU/

const メンバ関数
#03 const クラス型のメンバ変数

　前回は「 const クラス型で呼べるのは const メンバ関数だけ」って言い
ました。今回は、 const メンバ関数とメンバ変数の関係。

class CForConst
{
    int m_i;

public:
    CForConst()
        : m_i( 100 )
    {}
// ここにあとでメンバ関数を追加。
};

　これが const に使える関数の基本的なものね。初期化子（ : m_i( 100 ）
の部分）はしなくてもＯＫ。ここで必要なのは、デフォルトコンストラクタ。
これはないとエラーが出ちゃうからね。
　さて、ここでこのクラスにメンバ関数を追加します。ここで追加するのは、
m_i に値をセットするメンバ関数にしましょう。 const として使うのであ
れば、当然 const メンバ関数にする必要があります。

    void SetData( int p_i ) const
    {
        m_i = p_i;    // エラー。
    }

　ところがこれはエラーになるんです。実は、 const メンバ関数の中では
メンバ変数が const 状態になるんです。つまり、このメンバ関数の中では、
m_i は const int 型なんです。だから値は変えられません。
　しょうがないから、このメンバ関数は非 const にせざるを得ません。

    void SetData( int p_i )
    {
        m_i = p_i;
    }

　これならエラーが出ません。でも const メンバ関数じゃないから const
CForConst だと呼び出せません。

    const CForConst cForConst;
    cForConst.SetData( 100 );    // エラー。

　でもこれは当然。だって、呼べたら cForConst の値が書き換えられちゃ
って、 const の意味がなくなっちゃうじゃない。その整合性を取るために、
こんなふうに厳しくなってるんです。
　この辺重要だから、次も。じゃね。


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

・更新予定なし（汗）
　う、今のところ予定ないです。ただ、小説書いてるし、表紙ももっと変え
ていきたいし、色々予定はあるんで、なんかできるんじゃないかなー。でき
なかったらそれはドラクエのせいだ（爆）。


/*                          ご注意！！                            */

・このメールを返信しないでください。
・ご意見・ご希望・ご感想は[チョー普通な日記]よりお送りください。
http://www.kab-studio.com/nikki2/
・プログラミングに関する質問は[鏑矢の憂鬱]にお送りください。
http://www.kab-studio.com/Programing/KabuU/
・購読登録を解除したいときにはこのページで行なってください。
＊http://www.mag2.com/m/0000012198.htm
＊http://www.pubzine.com/detail.asp?id=000590
・解除は自分で行なってください。
・バックナンバーはこれらのページにあります。
http://bigbeat.tegami.com/~mgsearch/frame.cgi?id=0000012198
http://www.kab-studio.com/Freeware/

/*
    KAB-studio.h
    Weekly Mail Magazine.
    Written by Kaburaya Seiden.

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


/*                      See you next week!!                      */


