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

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

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

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

・KAB-studio.h お休み。
　KAB-studio.h の８月１４日配信分をお休みしました。
　理由はまぐまぐのお盆休み。ですが Pubzine 経由で配信しているものも
お休みしました。御了承ください。


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

・STL & iostream 入門お休み。
　 STL & iostream 入門の８月１６日分配信をお休みしました。
　理由はまぐまぐのお盆休み。最初から予定していたものなので、配信の遅
れ等はないのでご安心ください。


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

・KAB-studio.h 縮刷版更新。
　KAB-studio.h と #pragma twice が７０号になったので、縮刷版にしまし
た。ダウンロードはフリーウェアインフォメーションルームにて。
[フリーウェアインフォメーションルーム]
http://www.kab-studio.com/Freeware/


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

2000/08/06 (Sun)
　「えここ」が「アイスちゃん」に！！（泣）　本屋さんの努力。いろんな
アニメの話。そしておすすめハヤシライス。勧めるのって結構ドキドキです
よねー。

2000/08/07 (Mon)
　ゼミ課題ホームページ作ったりイラスト描いたり。イラストはもっともっ
と描かないとね。でも逆に、プログラミングしてない……。そしてえここ。

2000/08/08 (Tue)
　「大変４日間」の始まり。まずはドライブ。万世で食べたり小林さんの家
に行ったり。そしてえここ。

2000/08/09 (Wed)
　２日目。とうとうピッチ購入！　Ｈ"買いました。こんなちっこいのによー
動く。すげぇ……。そして緊急におばあちゃんの所へ。これはなんでもなく。
とりあえず安心。

2000/08/10 (Thu)
　３日目。慶應病院に行くおばあちゃんの付き添いに。行ったら急遽明日も
来ることに（汗）。行く事自体はなんでもないんだけど、朝早く起きなきゃ
いけないのと、責任を負わされてるってゆーストレスが結構。

2000/08/11 (Fri)
　４日目。再び慶應病院へ。この日は早めに終わったんで逆にゆっくり帰宅。
あとはちょっと楽なはず……。

2000/08/12 (Sat)
　ビデオの整理ってゆーか鑑賞会ってゆーか（汗）。そしてとうとう小説執
筆再開！　書くの久しぶりだなー。あとアニメのゾイドはかなりいいですよ。
そして、わてはまだコミケ行ったことない……。

2000/08/13 (Sun)
　のんびりな日曜日。小説書いたりアニメ見たり。そして戦争について。

2000/08/14 (Mon)
　小説書いて、あとそのイラスト書いて。小説は公開するのどうするか色々
迷ってたり。でもただめんどいだけかも（汗）。

2000/08/15 (Tue)
　電話代再び（汗）。ゲームしたり古本屋回ったりと。ドラクエどうしよう。

2000/08/16 (Wed)
　文章系は何もせず。イラスト描いただけ。名作・スターフォースとスター
ソルジャー。

2000/08/17 (Thu)
　いろんなことちょっとずつする。なんだかんだ言って、この夏休みって結
構密度高いのかも。同人誌・ＣＣさくら・そしてザナック！

2000/08/18 (Fri)
　立川駅へ〜。ゲーセン行ったりゲーム物色したり。でもほとんど何も買わ
ず（汗）。表紙リニューアルに向けたイラストひとつ完成。そしてザナック。
コンパイルが作ってたとは……。

2000/08/19 (Sat)
　昨日に引き続きゲームを買おうかと近場を回る。が、買わず（汗）。あい
かわらずや。そしてサイバーダイン社製品のラインナップについて。


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

2000/08/06 (Sun)
お休み

2000/08/07 (Mon)
お休み

2000/08/08 (Tue)
お休み

2000/08/09 (Wed)
お休み

2000/08/10 (Thu)
プログラミング辞書
BSTR や VARIANT とかの VB のもの
COM 関係で使う
中身が分かっていると役立つ

2000/08/11 (Fri)
プログラミング辞書
まだまだ単語追加したりない
ウィンドウズの細かい部分や、 C++ 言語の部分が少ない
初心者が読んでも分かりやすくしたい
でも単語数増えすぎているかも

2000/08/12 (Sat)
お休み

2000/08/13 (Sun)
お便り
Visual Studio IDE のような着脱式メニューの作り方は？
エクスプローラーのは「リバー」を使っている
MFC だと CReBar
これは細かいことは無理
VS は独自に作ったものを使っている
Codeguru にもあるから参考にして

2000/08/14 (Mon)
お休み

2000/08/15 (Tue)
プログラミング辞書
よく知らない分野の単語を追加すべきか
MSDN くらいのことしか書けない
追加しないようにした方がいいかもしれない
これからの「偏り方」とかもちゃんと考えた方がいいかも

2000/08/16 (Wed)
お休み

2000/08/17 (Thu)
プログラミング辞書
「アトミック」とか難しい
でもこういう単語こそ追加する意味がある
更新が頻繁だから間違えてても直しやすい
CMemFile とか
自分の知識を満遍なく埋められるのがいい

2000/08/18 (Fri)
お便り
タイトルバーと縁を消したい
WS_POPUP でタイトルバーなどは消えたが微妙に縁が残る
ウィンドウ枠を指定するウィンドウスタイルが入ってないか
ビューウィンドウの縁が残っているのかも
ビューウィンドウの必要性がないかもしれない

2000/08/19 (Sat)
お便り
ビューウィンドウのスタイルが変わらない
DirectX で塗り潰したら直った
ウィンドウを常に後ろに置いておく方法は？
それは難しそう
SetWindowPos() に HWND_BOTTOM を渡して呼び出すのを
タイマーでまめにするか
フックで手前に来るときに呼び出すか
デスクトップの子ウィンドウとして作れるかも
ビューのウィンドウスタイルは変えられると思う
Spy++ で確認してみては
ウィンドウのサイズを変えるとスタイルが変わった


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

・先週の追加単語：
BSTR CALLBACK explicit goto PASCAL union UTC VARIANT アイコン
エンディアン 音 外部シンボル クリック クリッピング 子ウィンドウ
サービスパック 再描画 ストリングテーブル タブ なんとか Alloc 
プリンター リテラル リテラル文字列 


・今週の追加単語：
演算子の優先順位 バインディング MSDB :: シンタックスエラー 
シグナル プロセスＩＤ テンキーボード 仮想キーコードの変換
gcc ロックカウント アトミック MSB MSB LSB LSB バイナリー 
バイナリーファイル テキストファイル ネゴシエーション
DirectX ショートカット ショートカットキー アクセラレーター
連想配列 辞書 


・先週のごめんなさい
dib winapi CORBA サンク ATL GlobalAlloc SetWindowsHookEx USR Mutex
readfile ファイル CDatabase コンテナ イテレーター CString extern
cpp 右クリック アンサインド クリッピング領域 プロセス フック DLL
型変換 FAR　PASCAL シリアライズ


・今週のごめんなさい
DLL メモリマップトファイル C++ ODBC ハンドル static スモールモデル
hdc ATL オーナードロー cfopen format リバースプロキシー 
テンキー　配列　法則 コールバック CMemFile SLT シグナル状態
イベントオブジェクト バイナリ・ファイル list インスタンス
cgi ファイルハンドル DirectShow IShellLink enum


・今週の状況：
　お、多い……。


{magclick}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『あ、 vector って配列の代わりになるんだ、なんか便利そう』
「そういうの使えるようになると、プログラムかなり楽かな」
『えーじゃー早く教えてよ〜』
　教えてよ〜なあなたは購読登録。
http://www.kab-studio.com/Programing/STLiostream/
_______________________________________________________________[KCM]
{magclick}


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

　Version 5.05
配列と文字列

「前回は文字と文字列について見てきました」
『よーするに文字は数字で、 char 変数の中に１文字ずつ入るのよね』
「で、文字列はその char の配列」
『そうそう』
「さて、まず最初は TRACE() で文字列全体を表示する方法」
『あ、そういえばまだだよね。文字一個は %c だったけど』
「文字列の時は %s にします。そうすれば変数を〈文字列だ〉って見なして
くれるから」

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

『あら簡単』
「さて問題です！！」
『げげ！！』
「これ、 %s じゃなく %c だけで文字列全体を表示するとしたら、どうすれ
ばいいと思う？」
『え？　それって前回やったじゃん』

void CharsArray()
{
    char chAry[] = "ABC";
    TRACE( "%c, %c, %c\n", chAry[0], chAry[1], chAry[2] );
    // A, B, C
}

「でもこれじゃ、 chAry が３文字入ってるときしかうまく働かないでしょ」
『あ、そっか。つまり、 chAry の中に何文字入ってるか分かればいいんだ
よね。だったら sizeof で』
「 sizeof は不可」
『ええっ、なんでぇ！？』
「前に言ったでしょ、 sizeof じゃ、ポインタから配列の要素数を調べるこ
とはできないって。配列じゃなく、ポインタが渡された場合って事で」
『なんかずるいー』
「後になればなんでか分かるから。じゃあ代わりにヒント」

41 42 43 00 8C F5 64 00 E2 19 40 00 2C F8 64 00 C0 01 52 00  ABC....

『これもこの前の、文字列の入ってるメモリ見たのじゃない』
「この他にも、 A や AB 、 ABCD で見てみると……」

41 00 CC CC 8C F5 64 00 E2 19 40 00 2C F8 64 00 C0 01 52 00  A......  
41 42 00 CC 8C F5 64 00 E2 19 40 00 2C F8 64 00 C0 01 52 00  AB.....
41 42 43 00 8C F5 64 00 E2 19 40 00 2C F8 64 00 C0 01 52 00  ABC....
41 42 43 44 00 CC CC CC 8C F5 64 00 E2 19 40 00 2C F8 64 00  ABCD...

「文字列のすぐ後の数字が……」
『あ、全部 00 になってる！！』
「そのとーり！！　じゃ、この関数を試してみて」

void StringSize()
{
    char chAry[] = "ABC";
    TRACE( "%X, %X, %X, %X\n", chAry[0], chAry[1], chAry[2], chAry[3] );
    // 41, 42, 43, 0

    TRACE( "%d\n", sizeof( chAry ) );
    // 4
}

『最初の TRACE() は、さっきのメモリ見たのと同じのだよね。２番目は、
あ、 sizeof 使っちゃいけないって言ってたのに使ってる！！』
「あーもう、ここだけだから！　で、どうなってる？」
『４。って、なんで！？　そいや、この前もそんなこと言ってたね』
「メモリで見たでしょ、 00 」
『うん、最初の TRACE() でも４番目の要素に０入ってるね』
「つまり！」
『つまり？』
「 "ABC" って感じに文字列をダブルコーテーションで囲むと、その最後に
値が０の文字が自動的に追加されるってこと」
『自動的に追加？』
「そう。この関数見てみて」

void NullChar()
{
    char chAry[] = "";
    TRACE( "%X\n", chAry[0] );
    // 0
    TRACE( "%d\n", sizeof( chAry ) );
    // 1
}

『うわ、 "" なのにサイズが１個ちゃんとある！　カラじゃないんだ。で、
そんなかに０が……』
「そう、だから３文字でも要素数は４個になるわけ。この、値が０の文字を
〈終端文字〉とか〈 NULL 文字〉とか言います」
『はて、どっかで聞いたような……』
「ちなみにこの終端文字は \0 って書きます」
『あ、なんだか \n みたい』
「そう、 \0 も \n もれっきとした文字。もちろん値でもあるし」
『 '\0' は０ってことだよね。 '\n' は？』
「 0x0A だから１０進数だと１０だね。調べればすぐ判るよ」
『 TRACE() で %X とか %d ですればいいんだよね』
「そうそう。で、 \0 って何のためにあるか分かる？」
『んー……もしかして、これで sizeof 使わないで文字列の長さが分かるっ
てこと？』
「そういうこと。そのために自動的に追加されるんです」
『でもどうやって？』
「配列の要素を先頭からひとつずつ調べていけば分かるでしょ」
『あー、うーん、分かりそうな気もするけど……』
「そだね、考えながら作っていこうか。まずは雛形」

void GetLengthWithIndex()
{
    char chAry[] = "ABC";

    // ここを作る。

    TRACE( "%d\n", /* 要素数の入った変数 */ );
    // 3
}

『うん、で、配列の各要素を調べるんだよね』
「とりあえず１番目の要素に固定して考えようか」
『１番目の要素が '\0' かどうか調べるんだから、えーっと…… if だ！』
「そう、値が同じかどうか調べるのは if 。詳しくは Ver 2.8 ( No.019 )
を見てください」
『ってことは……』

    if( chAry[0] == '\0' )
    {
        TRACE( "０文字だよ！\n" );
    }

「そうそう、そんな感じ」
『……でもこっから先が……』
「各要素を調べるんだから、 chAry[0] だけじゃなく chAry[1] や chAry[2] 
も調べればいいんでしょ」
『……』

    else if( chAry[1] == '\0' )
    {
        TRACE( "１文字だよ！\n" );
    }
    else if( chAry[2] == '\0' )
    {
        TRACE( "２文字だよ！\n" );
    }
    // ずっと続く……。

『んなわけないやん！　ははっ！！』
「いや、それほど遠くないよ」
『え”、そうなの？』
「つまりさ、 chAry の要素指定が０から１ずつ増えていって、増えるたびに 
if でチェックするんでしょ？　前にそういうのやったでしょ」
『今調べるっ！！　…… for ？』
「そう。 Ver 2.9 ( No.020 ) でやったでしょ」
『あ、 if の次の回だ……えーっと、 for ってこんな感じだよね』

    for( int iBox = 1; iBox < 6; ++iBox )
    {
        TRACE( "%d ", iBox );
    }

『ここで増やしたいのは、 chAry の要素の番号だよね。この番号の変数の
名前を iNo にすると』

    for( int iNo = 0;

『続ける条件は……あれ？　これはどうすればいいのかな』
「この for は配列を先頭から調べていって、０が入ってたら止めるように
するんでしょ」
『あ、そっか。あれ、でもそれってさっきの if と同じじゃん』
「そう。だからここは if に任せることにして、ここは空白にしましょう」
『く、空白ぅ！？　そんなことできるの？』
「できるよ。ただ、チェックされないから、他で for から抜けるようにし
ないと」
『 for の中回りっぱなし……それって無限ループってヤツよね』
「そうそう。逆に言うと、その抜けるのはどこですればいいと思う？」
『あ、 if のとこですればいいんだ！』
「そういうこと。その辺をイメージできるようにね」
『ほーい。で、最後は１ずつ増やすんだから普通に ++ 使えばいい、から』

    for( int iNo = 0; ; ++iNo )
    {
    }

『って感じかな』
「その中に無理矢理さっきの if を入れて、整形すれば」
『んじゃぼちゃんっ』

    for( int iNo = 0; ; ++iNo )
    {
    if( chAry[0] == '\0' )
    {
        TRACE( "０文字だよ！\n" );
    }
    }

「中カッコが増えたらインデントね。見やすくなるから」
『インデントって最初のタブのことだよね。あと、 chAry の要素の番号を 
0 から iNo に変えて、あとは TRACE() を……そう、 for から抜けるのに
すればいいんだよね』
「何使えばいいか分かる？」
『ちょっと調べる……あ、 Ver 2.9 に出てた。 break 使うんだ。だから』
「関数全体で見ると」

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

『ビルドして実行、うわ、ちゃんと３になる！　文字数変えても大丈夫！』
「こういうふうにすれば、文字列の長さが判るわけ」

/*
    Preview Next Story!
*/
『あー、なんか今日はちゃんとしたプログラム組んだって感じ！』
「教えなきゃかなりわかんなかったっぽいけど」
『ウルサイわねー、水希ちゃんが参考書代わりだからいーの』
「さ、参考書代わり……」
『というわけで次回』
＜ Version 5.06 文字列とポインタ ＞
「につづく！」
『未来のロボット家庭教師とかこんな感じだろうしー』
「火美ちゃんに言われるとなんかムカツク……」


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

const メンバ関数
#02 const クラス型

　前回言ったように、 const を使うことで「値が書き換えられる範囲」を
狭めることができて、様々な面でプログラムが良くなります。
　でも、 const が簡単に使えるのは組込型（プリミティブ型）だけ。クラス
を const に使用とすると、とたんに難しくなります。

class CNotConst
{
public:
    void NotConst()
    {}
};

　このごくごく普通のクラス。これを const として使ってみましょう。

    const CNotConst cNotConst;
    cNotConst.NotConst();    // エラー。非 const メンバ関数です。

　と、メンバ関数 CNotConst::Do() を呼ぶことができません。実は、 
const クラス型変数を通して呼び出せるメンバ関数は「 const メンバ関数」
だけなんです。そう、ここで const メンバ関数が出てくるんです。

class CConst
{
public:
    void Const() const
    {}
};

　CConst::Const() のあとに const って付いてるでしょ。これが
「 CConst::Const() は const メンバ関数です」っていう指定をしている部
分。こうすれば、 const CConst 型変数からでも呼び出すことができます。

    const CConst cConst;
    cConst.Const();

　あと当然だけど、これは const 参照や const ポインタでも同じだからね。
それと、非 const クラス型変数から const メンバ関数は問題なく呼び出す
ことができます。この２点に注意してね。
　さて、ここまで聴くと「ああ、つまりメンバ関数を const にすればいい
んだ」なんて思うかもしれないけど、そんな軽い気持ちだと、すぐ「 const 
メンバ関数なんて使いたくない！」って思うことになると思うよ。次回は
const クラス型とメンバ変数の関係。じゃね。


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

・祝２０万ヒット！
　たぶんこの日までには２０万ヒットに達してると思います。さらに 
KAB-studio は５周年を突破しました！　というわけで表紙をほーんのちょっ
とリニューアルしたいなーと思ってます。「リニューアルしない方が良かっ
た」とか言われそうな気も（汗）。


/*                          ご注意！！                            */

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


