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

    (C)KAB-studio ALL RIGHTS RESERVED.
        http://www2.justnet.ne.jp/~kabstudio/
        kab-studio@multimedia.design.co.jp

    送信日： 1999/07/19(Mon) No.016
    配信数： 2360（ Mag2 + Pubzine ）
    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/


/*            １９９９年７月１９日（月）の更新                */

・ナシ。
　テスト直前。だいぶヤバイ。とゆーわけで更新はナシ。



/*                チョー普通な日記                */

１９９９年７月１１日（日）：
　マンガ描いたりイラスト載せたりアニメ見たりでおたく街道まっしぐら。

１９９９年７月１２日（月）：
　鏑矢正伝、ハダカを語る（爆）。

１９９９年７月１３日（火）：
　買いたい物。それはエルゴフィットキーボード！　全然違う配列のキー
ボードを買うとゆー無謀な人の話。そして松坂、近鉄に完封！

１９９９年７月１４日（水）：
　フリーウェア作りたい病他、試験前のとーひの数々を今ここに公開。

１９９９年７月１５日（木）：
　とうとうエルゴフィットキーボード購入！！　まったく違うタイプのキー
ボードに挑戦するとはその心意気やよし！　心意気はね。

１９９９年７月１６日（金）：
　新キーボードで四苦八苦の毎日。必死に日記を書く様に君はたぶん涙す
る。

１９９９年７月１７日（土）：
　いきなり短いぞおい。



/*                    金菜さんの憂鬱                        */


１９９９年７月１１日（日）：
デバッグについて
ローカル変数の初期化
グローバル変数やスタティック変数は何もしないとゼロで初期化
ローカル変数は未定義
ＶＣのデバッグビルドでは必ず 0xCC で埋められる
この機能が特に役立つのはポインタ型変数を使うとき
エラーが必ず発生する

１９９９年７月１２日（月）：
デバッグについて
ＭＦＣの new と delete 
Ｃランタイムの _malloc_dbg() と _free_dbg()
#define new DEBUG_NEW 
_DEBUG が定義されているときには _malloc_dbg() と _free_dbg() を
定義されていないときには malloc() と free() を呼び出す
Ｃランタイムの _malloc_dbg() は８バイトの領域を余分に取得する
返すポインタは先頭から５バイト目
余分な領域は 0xFD で埋められる
_free_dbg() は 0xFD のままかチェック
変えられていたらアサート＆アウトプット

１９９９年７月１３日（火）：
デバッグについて
Ｃランタイムの _malloc_dbg() と _free_dbg()
メモリリークの検出
残ったポインタで領域に書き込まれたかどうかのチェック
サンプルコード
残念ながらデフォルトの機能じゃない
ＶＣ拡張関数
自作は難しくない

１９９９年７月１４日（水）：
デバッグについて
ダンプ
変数やファイルの中身を表示すること
昨日の機能でも
サンプルコード
CObject::Dump()
afxDump 
あまり使わない
お便り
コントロールのリスト
コントロールを動的に作成
サンプルコード
リストなどで管理
ウィンドウについて理解してると楽

１９９９年７月１５日（木）：
デバッグについて
例外処理
Ｃ＋＋の機能のひとつ
サンプルコード
try throw catch 
例外の利点と欠点
おまけ
「検索ダイアログ」を表示する
サンプルコード
言語間で照らし合わせ

１９９９年７月１６日（金）：
デバッグについて
落ちる
サンプルコード
ハンドルされていない例外
例外の一種
サンプルコード
「これで落ちなくなる」ってことじゃない
「落ちる」ってことはわけの分からないことじゃない
お便り

１９９９年７月１７日（土）：
デバッグについて
「デバッガ」
プログラムがどう動いているのか調べたり
変数がどう変わっているのか調べたり
ソースファイルデバッガ


/*                    #pragma twice                        */

　Version 2.5
楽をしてみよう！

「さて、問題！」
『げげ、いきなり？』
「これまでの知識で答えられる問題だから、心配しないでいいよ」
『で、その問題は？』
「 1 から 5 までの数字をアウトプットに出力してみて」
『はーい。えっと、アウトプットに出力するのは TRACE() だから……』

void CCalcDlg::OnBEqual() 
{
    TRACE( "1 2 3 4 5" );
}

『でいい？』
「ＯＫ。じゃ、第２問。 1 から 100 までの数字を出力して」
『げげげ！　何そのめんどいの！』
「というわけでこれを簡単にする方法を教えましょう」
『あ、そういうのがあるんだ』
「じゃ、第１．５問」
『げ、また問題？』
「第１問の数字を、変数を使ってするとどうなる？」
『えっと……変数って iBox とかのことよね。1 から 5 だから、ひとつず
つ増やして、出力して、ってことを繰り返せばいいんだから……』

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
}

『こうでしょ』
「そ。この辺はもう完璧？」
『だいたいはねー。前回のとかを使い回してるだけだし』
「そだね。じゃ、ちょっと新しいこと憶えてみようか」
『う”』
「えっと、」

    TRACE( "%d ", iBox );
    iBox += 1;

「の２行が、５回繰り返されてるんだよね」
『正確には４．５回かな』
「じゃあ〈５回〉にしてみようか。こういうふうにすれば、５回の繰り返し
になるよ？」

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
    iBox += 1;
    TRACE( "%d ", iBox );
}

『あ、ホントだ、でも余分なことしてて変じゃない？』
「でもこれだとちゃんと〈５回の繰り返し〉になるでしょ。そうすると便利
なものが使えるんだよね」
『便利なもの？』
「その繰り返しをしてくれるもの、それは while ！」
『ほわいる？』
「そ。日本語に訳すと〈〜の間〉て意味かな。これを使って、こんなふうに
書き換えてみようか」

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    while( 1 )
    {
        iBox += 1;
        TRACE( "%d ", iBox );
    }
}

『 while って関数？』
「ううん、小カッコ付いてるけど関数じゃないんだよ」
『なんか混乱するなー』
「大丈夫、小カッコ付いて関数じゃないのは５つくらいしかないから」
『まぁそれくらいなら大丈夫かな。で、これどうなるの？』
「試してみ？」
『はーい。ビルドして実行して……！！』

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 
（ずっと続く……）

『こここ壊れちゃったよ水希ちゃん壊れちゃったよどうしよどうしよ！』
「〈実行〉ボタンにｘ印が付いているのがあるでしょ、それ押してみて」
『は、はいっ！　……あ、止まった』

3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970
3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 
3984 3985 3986 3987 プログラム 'D:\Kamichan\Calc\Calc\Debug\Calc.exe'
はコード 0 (0x0) で終了しました。

『ビックリしたー、ダイアログの【キャンセル】ボタン押しても閉じないん
だもの』
「数字を表示するのに忙しくて押されても分かんない、ってとこかな」
『忙しいとかそういうことあるの？』
「あるんだよね、これが。ま、それは置いといて、さっきのプログラム見て
みようか」
『はーい。こんなふうになったのって、やっぱり while ってヤツのせいよ
ね』
「そういうこと。実際にどう動いてるのか、ブレークポイントで止めて見て
みようか」
『あ、そっかー、実際に自分でひとつずつ進めてみればわかるもんねー』
「やりかた憶えてる？」
『……いつやったっけ、それ』
「えっと…… Ver. 2.1 とか 2.3 かな」
『ちょっと待ってね、今読み返すから……あ、手のひらのアイコンをクリッ
クすればいいんだ。どこにセットすればいいの、ブレークポイント』
「while(1) の行かな」
　言われた通り while の行をクリックし、〈手のひら〉アイコンをクリッ
クする。ブレークポイントの印、●が左端に表示される。
『状況描写って久しぶりね』
「んなこたいいから実行！」
『はーい』
　実行して【＝】ボタンを押すと、アプリケーションが止まり、●の上に矢
印が表示される。
「あとは〈中カッコの上を乗り越える〉アイコンを繰り返し押してけば分か
るかな」
『〈関数の中に入らず出もせず〉ってヤツよね』
　〈中カッコの上を乗り越える〉を押すたび、矢印が下の行へと移動する。
そして、下から２行目の中カッコで押すと、 while の行へと矢印が瞬時に
移動する。
『へー、こーゆーふーに繰り返されるから、どんどん数字が書かれていった
んだー』
　アウトプットを見ると、 TRACE() の次の行になるときに、数字が書き込ま
れる。
『……で、これいつまで続けるの？』
「ずっと終わんないよ」
『あ、さっきのアイコンで止めなきゃいけないんだ』
　〈実行にｘ〉アイコンを押してアプリを止める。
「これで while が繰り返しをしてくれるってことは分かったよね。んじゃ、
その仕組みについて見てみようか」
『まず質問！』
「はい、火美ちゃん」
『関数の中に中カッコがあってもいいの？』
「実は、中カッコと中カッコ閉じがちゃんと１組揃ってるんなら、関数の中
にいくらあってもいいんだよ」
『ってことは……』

void CCalcDlg::OnBEqual() 
{
    {
        {
            {
            }
        }
    }
}

『とかでもいいの？』
「もちろん」
『じゃあさじゃあさ、』

void CCalcDlg::OnBEqual() 
{
    {
}    //    ここで関数終わり。
    }    

『とかしたらエラーになる？』
「ならないよ……」
『ええっ！？』
「だって、インデントとか、改行とか、そういうのは関係ないんだから、関
数の中カッコは、最後の中カッコ閉じに対応するでしょ」
『うーん……』
「だから、こんなんだっていいんだよ？」

void CCalcDlg::OnBEqual() 
{{{{}}}}

『あー、よーするに見かけに騙されちゃダメってことね』
「でもヒトは見かけに騙されるもんだから、インデントして見やすくするわ
け」
『ここは中カッコの中ですよー、ってことね』
「で、 while の下の中カッコ＆閉じは〈この中を繰り返す〉っていう意味」
『うん、実際繰り返されてたね』
「で、一番のミソは while( 1 ) の小カッコの中。実は、この小カッコの中
がゼロ以外の時は、中カッコの中を実行し続けるっていうのが、この while
の特徴」
『？　1 は〈ゼロ以外〉だよね、だからずっと続けてたってこと？』
「そういうこと。でゼロの時には中カッコの中は実行しないんだわ」
『？？』
「ま、これを試してみれば分かるかな」

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    while( 0 )
    {
        iBox += 1;
        TRACE( "%d ", iBox );
    }
}

『これって while の小カッコの中がゼロってだけの違いよね』
「そ。試してみ？」
『はーい。ビルドして実行……あ、何も起きないね』
「ブレークポイントを使って見れば分かるけど、 while の次は下から２行
目の中カッコに移動しちゃうから」
『これが、ゼロだと中カッコの中は実行されない、ってことなのね』
「で、この while の小カッコの中のチェックは、実は１回繰り返すごとに
行われるから、それで繰り返しの回数を調節できるんだわ」
『よーするに、 TRACE() の次、while の行に戻った時に小カッコの中がゼ
ロかそうじゃないか調べるってことよね。でも 0 とか入ってたら……あ』
「そう、変数を使えば、うまく回数を調節できるでしょ。たとえば、こんな
プログラムは？」

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 0;
    int iChecker;
    iChecker = 1;
    while( iChecker )
    {
        iBox += 1;
        TRACE( "%d ", iBox );
        iChecker = 0;
    }
}

「これはどう動くと思う？」
『えっと、 iChecker っていう変数を作って、その中に１を入れて、それを
while でチェックして……１が入ってるんだから中カッコの中に入るんだよ
ね』
「そうだよ。で、中カッコの最初２行は同じ。最後は？」
『 iChecker にゼロを入れてるね。で、そのあと……あ、while の行に戻る
んだよね。このとき iChecker の中身をチェックして、今度はゼロが入って
るから、中カッコの中に入らない、で、終わり、ってこと？』
「そういうこと。だからこれだけだと 1 しか出力されないってことだね」
『ふーん……』
「ま、よーするに while は〈小カッコがゼロじゃない間は実行する〉ってい
うふうに憶えるといいかな」
『……』
「……火美ちゃん聞いてる？」
『あ、あのね、もしかしてこういうふうにすればいーんじゃない？』

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 5;
    while( iBox )
    {
        iBox -= 1;
        TRACE( "%d ", 5 - iBox );
    }
}

『こうすれば５回中カッコの中を繰り返したときに iBox の中がゼロになる
から、うまく５回だけ表示できるんじゃない？』
「そう！　分かってきたじゃん」
『でしょでしょ！　へー、こういうふうにちゃんと便利な道具が揃ってるん
だー』
「こういう道具を憶えること、うまく使いこなせてくことが上達の近道か
な。while が使えれば、第２問だって簡単に答えられるでしょ」
『あの 1 から 100 までってヤツ？　楽勝でしょ』
「でも、もっと楽な方法があるんだよねー」
『え？』


/*
    Preview Next Story!
*/
『今回は２８０行オーバー。だんだん長くなってくね』
「でもプログラムが増えてるだけだから、読むの辛くはないでしょ」
『似たプログラムが繰り返し出てくるしね』
「だから書く方も楽」
『手抜きー』
「う”」
『というわけで次回』
＜ Version 2.6 便利なものいろいろ！ ＞
「につづく！！」
『楽とか便利とか、いい話ばっか』
「プログラムではそれが大事なのだよ君ぃ！！」
『な、なに？』


/*
    おまけ！
*/

『では次のお便り！　東大和市の〈キョロちゃんイカス！〉君から』
「ベタなペンネームですねー」
『先日買ったＣ言語の本の最初に、こんなプログラムが載っていました』

#include <stdio.h>

main()
{
    printf( "Hello, world!" );
    return 0;
}

『でもこれをどうやってＶＣで使えばいいのか分かりません。教えてぷりー
づ！　ってゆー質問だけど……』
「ひどいプログラムですねー」
『ヒドイの？』
「酷いです。ま、こんな本買っちゃったのが運悪いって感じですね」
『そこまで言う……』
「で、移植方法だけど、まず具体例としてはこんな感じにするとうまくいく
と思います」

// CalcDlg.cpp : インプリメンテーション ファイル
//

#include "stdafx.h"
#include "Calc.h"
#include "CalcDlg.h"
#include <stdio.h>    //ここに追加。

//    略。

void CCalcDlg::OnBEqual() 
{
    TRACE( "Hello, world!" );    //printf を置き換え。
//  return 0;    //この行は削除。
}

『あれ、これってここ最近ずっと使ってる関数よね』
「そ。 main() も関数だから、まず main() の中身をこの中に移しちゃって
ください。次に、 printf を TRACE に書き換えてね」
『 TRACE() って、これも使ってるのだよね、アウトプットに出力するの』
「機能としてはほとんど同じだから置き換えられるんです。んで return の
行を削除」
『これなんで削除するの？』
「うーん、これはまた今度ね」
『う”ー』
「あと、 #include のところは、同じファイルの上の方に移しちゃえば大丈
夫。ただ」
『ただ？』
「これはなくても動くよ」
『そーなの？』
「そーなの。ま、こういうふうに移せば、＝を押したときに本に載っていた
こととほとんど同じことができると思います」
『本が無駄にならなくて良かったね。じゃ、また来週！』




/*            １９９９年７月２６日（月）の更新予定                */

・未定。
　まだテストはあるんだけど、１科目だけになるんでなんか更新できるかも。
たぶんちょこっとだけだと思うけど（汗）。



/*                        ご注意！！                        */
/*

　このメールマガジンをそのまま「返信」すると、作者のメールアドレス
（kab-studio@multimedia.design.co.jp）へと転送される仕組みになってい
ます。「まぐまぐ」もしくは「Ｐｕｂｚｉｎｅ」の管理者へメールを送りた
い場合には、直接そちらへメールを送ってください。

*/
/*

　このメールマガジンの購読登録を解除する場合には

http://www2.justnet.ne.jp/~kabstudio/Info/MailMagazine/

　が便利です。また、購読解除についての詳しい情報は、
登録時に送られてきた「まぐまぐ」もしくは「Ｐｕｂｚｉｎｅ」からの
メールをお読みください。

*/
/*

　本誌のバックナンバーはＫＡＢ−ｓｔｕｄｉｏにはありません。
　まぐまぐの

http://bigbeat.tegami.com/~mgsearch/frame.cgi?id=0000012198

　にありますのでそちらをどうぞ。

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

    (C)KAB-studio ALL RIGHTS RESERVED.
        http://www2.justnet.ne.jp/~kabstudio/
        kab-studio@multimedia.design.co.jp
*/


/*                    See you next week!!                    */


