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

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

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

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

・表紙を１０月バージョンに！
　なんともう表紙が１０月バージョンに！（爆）　９月表紙、たった１週間
の命（泣）。今月のはさらに結構いい感じにできたかなと。壁紙バージョン
もあります。ダウンロードは CG Gallery にて。

[CG Gallery]
http://www.kab-studio.com/CG/Gallery/


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

2000/09/24 (Sun)
　ここ最近ホント眠いにゃ。いきなし飛ぶが大運動会とゆーテレビアニメは
かなりいいんですよ。かなり。

2000/09/25 (Mon)
　ゼミの課題やって１０月表紙の主線描いてドラクエして。そして私は
ジャージ萌え。

2000/09/26 (Tue)
　１０月表紙完成！！　あっとゆーまの完成ですな。ＣＧに興味のあるあな
たのために、そのテクニックを詳述！　あとギルティギアＸとかドラクエと
か CLAMP の新作とかとか。

2000/09/27 (Wed)
　ぷらとわ書いたり。あー最近ドリキャス欲しい。もはや落ち目と言われて
も、私はあうとりがしたい〜。そしてまぐまぐバックナンバーの恐るべき秘
密。

2000/09/28 (Thu)
　焼き肉レストラン安楽亭に行って焼き肉を食べたから眠い？

2000/09/29 (Fri)
　デジカメ買うかも〜。シンクロ好き〜。 STL & iostream 入門 Codian 
化〜。

2000/09/30 (Sat)
　デジカメを買ってしまった〜！！　値段は９５００円（爆）。コストパ
フォーマンスかなりいいです。


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

2000/09/24 (Sun)
fscanf() の問題点がはっきり分からない
誰か教えて
お便り
ローカルフックの問題が解決
Thread ID を SetWindowsHookEx() にセットしたらうまくいった
Codian の方にも書いておいた

2000/09/25 (Mon)
お休み

2000/09/26 (Tue)
お便り
DLL の呼び出しでエラーが出る
Exe から DLL のメッセージポンプの呼び出しがうまくいってない
テクニカル ノート 11
メッセージポンプはスレッドに１個
エラーがどこに出てくるかチェックするといいかも
ウィンドウ作成のタイミングはいつでもＯＫ
親の CWinApp 派生クラスの m_pMainWnd が NULL のままだと動かない
親ウィンドウを ShowWindow() SW_HIDE で作っておくといいかも
お便り
fscanf() はスタックオーバーフローの危険性がある
"実行できるはずの無いコード"が実行されうる
iostream や C++ は実務ではあまり使われない
「 fscanf() は fgets() と sscanf() で代用すべし」の理由が知りたい
誰か教えて
内定先でどこに配属されるか楽しみ

2000/09/27 (Wed)
お便り
メッセージポンプは Exe と DLL でふたつになるのでは？
メッセージポンプは GetMessage() でメッセージキューから取り出し
DispatchMessage() で各ウィンドウプロシージャにメッセージを送る部分
MFC の場合 CWinApp::Run() にある
これが Exe と DLL あわせてひとつだけ実行されるようになっている
モードレスダイアログのアクセラレーターテーブルの処理のために
DLL 側の CWinThread::PreTranslateMessage() を呼び出す必要がある
拡張 DLL にすれば分かりやすくなると思う

2000/09/28 (Thu)
お便り
if のあとでエラーが出る
ソースコードがないと難しい
「不正な処理」ダイアログの「詳細」欄は役に立たない

2000/09/29 (Fri)
お便り
フレームウィンドウへの BitBlt() で画面外へ移動すると汚くなる
MFC SDI 形式でビューに描画した方が楽そう
デスクトップに直接描画はちょっと危険
フレームウィンドウに描画する形にしてもやや問題ありそう
モジュール化のための DLL なら拡張 DLL にしましょう
ただし MFC42.dll 等が必要に

2000/09/30 (Sat)
お便り
サンプルコード
strcat() で配列のサイズを超えて書き込んでいる
配列だとチェックが難しい
VC のデバッグ版 new & delete なら
お便り
MFC の AfxRegisterClass() に渡すウィンドウプロシージャ
全部 AfxWndProc() でいいの？
内部で振り分けられるからＯＫ
CWnd::FromHandlePermanent() で HWND を元に分別される


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

・追加単語：
ストール #pragma UTF-8 EDI チャット POSIX

・今週の状況：
　うにゃ、ばり少ないですな。確かに goo 経由の人が減った関係でヒット
数は半分に落ちたんだけど、追加単語はそれ以上に少ないです。リピーター
さんは使い方を知ってるから、検索とかと間違えて送っちゃったりしないっ
てことなのかも。もちっと多くても大丈夫だから気兼ねなくねー。


{magclick}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『とうとう次の水曜日から再放送決定！』
「しかも来週月曜から Codian 化！！」
『でもバックナンバーで今すぐ前号見られるんだよね』
「それじゃ趣がないでしょ」
『おもむき……？』
http://www.kab-studio.com/Programing/STLiostream/
_______________________________________________________________[KCM]
{magclick}


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

　Version 5.11
ランタイムでファイル操作！

「前回は iostream を使ってファイル操作をしました」
『 std::ifstream ってゆーの使ったんだよね』
「今回はＣランタイムの関数を使って、ファイル操作をしようと思います」
『ランタイムにもそういう機能があるんだ』
「まずはいつもの CFileTestDlg::OnBtnShow() の最初をこう書き換えて」

void CFileTestDlg::OnBtnShow() 
{
// ここにあとで追加します。

    return;

    int i;
// あとは前回のと同じ。

『ん？　return したら関数終わっちゃうよ』
「その return の前にあとで紹介するプログラムを描き込むから」
『どゆこと？』
「これからランタイムの使い方を教えるんだけど、これはあくまで勉強用の
テストだから、あんまり CFileTestDlg::OnBtnShow() の中身は書き換えた
くないんだよね」
『つまり iostream 使ったのをメインにしたいんだよね』
「そういうこと。だから、テストは CFileTestDlg::OnBtnShow() の最初に
書き加える形にして、この前作った部分はとっておきます」
『 return ですぐ関数が終わっちゃうのは、 iostream 使った部分が実行さ
れないようにしてるから？』
「そう。ま、ホントはテスト自体はテスト用のプロジェクトでした方がいい
んだけどね」
『前もそんなこと言ってたね』
「でもそうすると Data.txt とかの用意が面倒だから、ここでしちゃうこと
にします」
『手抜き〜』
「う”」
『で、 return の前はどうするの？』
「とりあえず、 iostream を使ったときと同じことをランタイムですると、
こんな感じになります」

void CFileTestDlg::OnBtnShow() 
{
    // ファイルを開きます。
    FILE *pstFile
        = fopen( "Data.txt", "r" );
    if( !pstFile )
    {
        TRACE( "ファイルがない！\n" );
        return;
    }

    int iError = 0;
    int iTemp = 0;
    while( !feof( pstFile ) )
    {
        char chOneLine[256];
        fgets( chOneLine, 255, pstFile );
        iError = sscanf( chOneLine, "%d", &iTemp );
        if( iError == 0 )
        {
            TRACE( "整数値じゃないです\n" );
            break;
        }
        char chDest[256]; 
        sprintf( chDest, "%d", iTemp );
        m_cDataLstBox.AddString( chDest );
    }

    // ファイルを閉じます。
    fclose( pstFile );
    return;

// 以下略。

『うあ〜、長いし分かんないし難しそう！！』
「初めて出てくるのがいっぱいあるからねー。ひとつひとつ見ていくよ。ま
ずここから」

    FILE *pstFile
        = fopen( "Data.txt", "r" );
    if( !pstFile )
    {
        TRACE( "ファイルがない！\n" );
        return;
    }

「まず fopen() から。これはランタイムの関数のひとつで、ファイルを開
くもの」
『 std::ifstream::open() と同じってことだよね』
「そう、この関数を呼ぶことで、ファイルが使えるようになります。第１引
数は開くファイルのファイル名、第２引数はファイルモードの指定」
『ファイルモード？』
「書き込みか、とか、読み込みか、とかを指定するための。 "r" だと読み
込み専用、 "w" だと書き込み専用。この辺は fopen() のリファレンスに書
いてあるから」
『文字列で指定って、 TRACE() とか sprintf() とかみたい。でも、なんで
std::ifstream のときにはこういうの使わなかったの？』
「 std::ifstream はそういうのを省略できるから、わざわざ書かなくてよ
かったわけ」
『へー』
「この〈省略できる〉っていうのは C++ 言語の機能。ランタイムは C 言語
の時代に作られたから、そういう機能がついてないわけ」
『それだけ使いづらいってこと？』
「そうなるんだよね。これから見ていくけど、そういうのいっぱいあるか
ら」
『げげ』
「さて、 std::ifstream はクラスだから、このクラスの変数を作って、
ファイルの情報を全部蓄えることができました」
『へー、そうだったんだ』
「ところが、 fopen() は関数だから、そういう情報を外に置かなきゃいけ
ない」
『もしかしてそれが pstFile って変数？』
「そういうこと。 FILE っていう構造体へのポインタが返ってくるから、そ
れを受け取って使います」
『？　こうぞうたいってなに？』
「……クラスみたいなもの！」
『ホントにぃ？』
「基本的にはね。クラスと同じく、いろんな変数を格納できる型だから」
『その中にファイルの情報が入ってるんだ』
「注意して欲しいのは、ポインタとして返ってくること」
『それって変じゃない？　変数って関数から抜けるとなくなっちゃうんだか
ら、そういうことってできないはずでしょ』
「 Ver 4.13 ( No.063 ) でも見たけど、変数を自由に作れて自由に削除す
る方法があるから」
『あ、 new と delete とかゆーのだよね』
「ここで返ってくるポインタが指し示してる変数は、そういうふうに作られ
た変数ってことだね。あとでちゃんと削除するし」
『へー』
「で、この FILE のポインタを〈ファイルポインタ〉って言います。よく使
われる単語だから憶えといて」
『って、そのまんまじゃん』
「あ、でも〈ファイルポインタ〉って違う意味で使われることもあるから
ちょっと注意」
『はーい』
「で、もしファイルがなかったら、このポインタには NULL が返ってきます」
『ぬるってなに？』
「……あ、 NULL 教えてなかったか……。ポインタってアドレスを入れる変
数でしょ」
『そだよ、変数はメモリ上にあって、メモリの住所がアドレスで、それを取
っておくのがポインタ』
「で、アドレスは整数値でしょ。この整数値が０のアドレスを NULL ってい
います」
『？？』
「つまり NULL == 0 って考えればＯＫ。実はメモリ上の０の部分は使えな
いから、この 0 のポインタを使って操作することはできないから」
『つまりエラーのときはこの NULL ってのが返ってくるってことなんだよね』
「そういうこと。ポインタが戻り値として返ってくる場合には、こういうふ
うになってることが多いから。成功したら、使えるアドレス。失敗したら、
使えない NULL が返ってくる、ってこと」
『で、次の if( !pstFile ) はそれをチェックしてるんだ。 !pstFile だと
０のとき０以外になるから if の中に入ってエラー表示、だね』
「これが std::ifstream::fail() の代わりになってます」
『これって TRUE と FALSE にちょっと似てる感じ』
「うん、そういう意味合いのものだね。基本はただの整数なんだけど、それ
に別の名前を付けて意味を持たせてるって感じかな。ちなみに null は英語
でゼロとかって意味」
『でもなんで NULL って別名付けるの？　0 でもいーじゃん』
「難しいところだね。 NULL はポインタにしか使わないから、そういう意味
で分かりやすいってことはある」
『あ、つまり普通の整数値の 0 と、アドレスの 0 の違いみたいな？』
「なんだけど、実際には NULL ってまんま 0 と同じだから、見た目の違い
しかないんだよね」
『どゆこと？』
「つまり int i = NULL; ができるってこと。これがバグの原因になったり
もするから、 NULL じゃなく 0 を使う人も最近多いみたいだね」
『なんか複雑……』
「ま、この辺は C++ のことをもっと知らないとわかんないかも」
『やっぱ iostream の方が分かりやすいかなー』
「確かにファイルポインタが NULL かどうか、っていうのに比べればね。こ
こから先、ファイル操作を擦るときにはファイルポインタの pstFile を使
っていくことになります」
『この前の cIFStrm の変わりね』
「さて、ずばっと飛んで、この行を見て」

    // ファイルを閉じます。
    fclose( pstFile );

『あ、これがさっき言ってた、ファイルポインタを削除するってとこでしょ』
「そう、ファイルポインタが指し示す変数はローカル変数じゃない形で作ら
れたものだから、自動的に削除されないんだよね」
『だから使い終わったら削除する、と』
「削除したらそのファイルポインタは使えないから」
『また fopen() しなきゃいけないってことだよね』
「そういうこと。 fclose() したあと pstFile = NULL してもいいかも」
『その方が安全そうね』
「それと、ファイルポインタを削除するだけじゃなくて、実際にファイルに
アクセスできなくする機能もあるからね」
『どゆこと？』
「ちょっとあとで説明するけど、ファイル操作って基本的にはＯＳの機能」
『ウィンドウズに、ファイルを操作する機能が付いてるんだ』
「 fopen() はファイルを使えるようにする関数、 fclose() はもう使わな
くていいよう閉じる関数。このふたつは、間接的にウィンドウズのファイル
操作機能を呼び出してるもの」
『なんか MFC みたい』
「そういう感じのもの。で、ファイル操作をするためのデータを、動的に作っ
た変数に入れて、そのポインタを返す」
『それがファイルポインタなんだ！』
「 fclose() するときには、まずウィンドウズに〈このファイルは使いませ
んよ〉って宣言してから、動的に作った変数を削除する。なんか今の話だと
変数作って削除するってとこだけ注意が向いてるみたいだから」
『うん向いてた。つまり、変数を作って削除、も機能のうちだけど、ファイ
ルを開いて閉じる、っていうのの方がちゃんとした機能ってことね』
「そうじゃなきゃ std::ifstream::open() の意味ないでしょ」
『でもさ、 std::ifstream の方には fclose() に当たるのないでしょ』
「 std::ifstream::close() ってメンバ関数がそれに当たるの。でも、自動
的に呼ばれるから使ってないだけ」
『自動的に呼ばれる？』
「そう、これも C++ の機能のひとつで、デストラクタって機能を使ったも
の」
『これも C++ の便利さなんだ』
「こういうふうに C++ のいいところが使われてるから、 std::ifstream の
方が便利なんだよね。とういうわけで次回に続く！」

/*
    Preview Next Story!
*/
『お、 while ループは来週？』
「またこーやって長くなる。こういうのって普通の本にも載ってるんだよね」
『でもあたし、水希ちゃんの解説で聞きたい！』
「それってもしかして……」
『というわけで次回』
＜ Version 5.12 ランタイムは面倒！ ＞
「につづく！」
『だって水希ちゃんの解説って……』
「……解説って？」
『タダじゃん！』
「あう」


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

const メンバ関数
#08 呼べるメンバ関数、呼べないメンバ関数

　まず次のクラスを見てください。

class CTest
{
    void Const() const;
    void NotConst();

public:
    void Get() const;
};

　CTest::Get() の中から呼び出せるのは、前回解説したように 
CTest::Const() の方。 const メンバ関数から呼び出せるのは const メン
バ関数だけだから。この例だと、 Get() から NotConst() は呼べないわけ。
　もし、 Get() の実装上 NotConst() を呼ばなきゃいけない場合、方法は
みっつ。
　ひとつは NotConst() を const メンバ関数化すること。もちろん、もし
できるのなら、だけど。 NotConst() の中でメンバ変数を書き換えてたら、
もちろん const 化はできません。
　ふたつめは、 NotConst() とほとんど同じものをもうひとつ作っちゃって、
それを const 化しちゃう方法。 Get() を使う場合にはメンバ変数の書き換
えは必要ない、っていう場合に有効。だけど、 private なメンバ関数が増
えるからその点では歓迎できないね。
　最後の方法は、 Get() の方を非 const 化しちゃ方法。実際、こうして 
const メンバ関数をまったく使わない方向でいくのが一番楽。でも、もちろ
ん const クラスや const ポインタ、 const 参照は使えなくなっちゃうけ
どね。
　一番の問題は、実装部によってシグネイチャーが変更される可能性がある
ってこと。設計の段階で「これは読み取り専用だから const メンバ関数に
しよう」ってしても、実装の関係で非 const にせざるを得ない場合なんか
も出てきて、そうなるともう混乱の極み。もし「 const 参照なんていらな
い」って思ったら、もう const メンバ関数を使わなくなっちゃいます。来
週はオーバーライドの問題について。じゃね。


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

・「 STL & iostream 入門」再放送スタート！
　メールマガジン STL & iostream 入門の再放送がスタートします！
　 あくまでメール形式で読みたいあなた向け。毎週少しずつ勉強できます。
さらに、これまでのバックナンバーを完全公開！　Codian 化を前に予習し
ましょう。

[ STL & iostream 入門]
http://www.kab-studio.com/Programing/STLiostream/


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

・「 STL & iostream 入門」Ｃｏｄｉａｎ版スタート！！
　メールマガジン STL & iostream 入門が Codianに ！　まずは #05 くら
いまでを掲載。新たに図を追加し、 C++ 編を本文中に埋め込みました。 
STL と iostream に興味のあるあなたはぜひ読むベシ！

[Codian]
http://www.kab-studio.com/Programing/Codian/

[ STL & iostream 入門]
http://www.kab-studio.com/Programing/STLiostream/


/*                          ご注意！！                            */

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


