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

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

    送信日： 2000/11/13(Mon) No.082
    配信数： 3880（ Mag2 + Pubzine ）
＊    発行元： まぐまぐ( URL: http://www.mag2.com/  ID: 0000012198 )
＊    発行元： Pubzine( URL: http://www.pubzine.com/  ID: 590 )
*/

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

・プログラミング辞書受付短期休止
　プログラミング辞書の単語受付を２週間だけ休止します。
　休止期間は１３日（月）〜２６日（日）。理由は忙しいから（爆）。ま、
たった２週間だけなんでちょっとだけ待ってね。
[ プログラミング辞書 ]
http://www.kab-studio.com/Programing/Dictionary/


・ Codian - iostream に追加！
　 Codian の iostream にページを追加します！
　今回は「 STL & iostream 入門」の中から iostream の #07 - #10 を追
加。今回ももちろん図入りです！
[ Codian ]
http://www.kab-studio.com/Programing/Codian/


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

2000/11/05 (Sun)
　「テスト終了５分前！　そのときあなたは？」の結果発表！　っつーか投
票数多過ぎ（汗）。テレビ色々Ｎスペはペット。「売れる商品」ってなん
じゃらほい。

2000/11/06 (Mon)
　祝２３万ヒット！　ここ最近ヒット数多くてちょっと嬉しかったり。そう
そう、カウンターは表紙の一番下にちっこくあります。

2000/11/07 (Tue)
　就職前研修（出向）初日！　かなりベタベタな内容ながらも結構知らない
こと多かったり。「タイトルバー左端のアイコンの名称」なんて知らんて。

2000/11/08 (Wed)
　８インチフロッピーに歳の差を感じる今日この頃。辞書書きって結構疲れ
るのよね。あとヒット数の話。

2000/11/09 (Thu)
　ルーダーフィンのホームページをやっと見つけたり、ＣＬＩＥのＴシャツ
柄をやっと見つけたりと日々悠々自適。

2000/11/10 (Fri)
　就職前研修（提出物）をする。これが結構な量でねぇ。しかも、提出物、
出向の他にもうひとつ CD-ROM ってものもあるんですよ。結構大変。

2000/11/11 (Sat)
　ウェブコミックを本気で載せようと試みつつあるわての日々！　つーか単
にマンガ描いてるただのオタクだが（爆）。そして、封印を解かれたわてが
久々に真面目なこと語る！　


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

2000/11/05 (Sun)
Codian に STL の「関数オブジェクト（前編）」を追加
来週は iostream の「文字列からの読み取り」を追加する予定
就職前研修（提出物）

2000/11/06 (Mon)
辞書の単語多い

2000/11/07 (Tue)
就職前研修（出向）

2000/11/08 (Wed)
「ガベージコレクション」派？　それとも「ガーベジコレクション」派？
選択状態のアイコンの取得
CImageList::Draw() （ API なら ImageList_Draw() ）に ILD_SELECTED 
SHGetFileInfo() に SHGFI_SELECTED 
Knowledge Base の Q128786 に自分で描画する方法が

2000/11/09 (Thu)
ぷらとわ書き
結局 API を使っているという話
こまごまとしたことを書いていきたい
その方が重要だから
最終回がいつになるか不明

2000/11/10 (Fri)
就職前研修（提出物）
１３日から２６日までの間は辞書の単語受付をお休み

2000/11/11 (Sat)
お休み


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

・追加単語：
B 言語 BCD NMAKE try Windows NT 外部キー ガベージコレクション 
コードウォーリアー シフト シングルタスク スクリプト タイマー
多重継承 テクスチャー 排他処理 標準関数 標準 C ライブラリ 
ファイルスコープ プラットフォーム ホットアイテム マジックナンバー 
マジックファイル マルチタスク レンダリング ワード 

・今週の状況：
　前述の通り、１３日から２６日までの間、辞書の単語受付をお休みします。
今回も思いの外多かったし〜。んでも最近「検索」っぽいの減ったな。
リピーターさんが増えたってことならうれしいかも。


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

テンプレート
#02 テンプレートのインスタンス化

　前回の関数テンプレート。

template< class type_numeral >
type_numeral Increment( type_numeral p_num )
{
    ++p_num;
    return p_num;
}

　まだ、この状態では「プログラム」になっていません。「プログラムの前
の状態」です。もしこの関数テンプレートをプログラムに加えて「使わない」
でおけば、コンパイル時にコンパイラはこの関数テンプレートをコンパイル
しません。つまりこの関数テンプレートを無視してしまうんです。なぜって、
関数テンプレートは「関数じゃない」「プログラムじゃない」からです。
　プログラムと見なされる、関数として扱われるためには、この関数テンプ
レートが「使われる」必要があります。

    Increment( 100 );

　これが関数テンプレートを「使っている」状態です。このとき初めて、関
数テンプレートはちゃんとした「関数」になることができます。
　コンパイラはこの「関数テンプレートを呼び出している部分」を見つける
と、まず引数の型を調べます。ここでは 100 なので整数値です。そこで、
コンパイラは引数の型を int 型と決めます。
　次にコンパイラは、コンパイラの記憶領域に関数テンプレートのコードを
読み込みます。そして引数の型名を確認します。

template< class 
    type_numeral // テンプレート引数。
>
type_numeral Increment( 
    type_numeral // 引数の型名。
p_num )

　「引数の型名」が「テンプレート引数（ template<> の鍵カッコのの中の
 class で指定された単語）」と一致した場合、引数の型名を int に置き換
え、さらに関数テンプレート全体の中で同じ「引数の型名」を使っている部
分を int に置き換えます。

template< class int >
int Increment( int p_num )
{
    ++p_num;
    return p_num;
}

　このとき、コンパイラの記憶領域中に「関数」が誕生しました。これを
「関数テンプレートのインスタンス化」と言います。
　この状態はれっきとした関数です。この時点でやっと、この関数はコンパ
イラにコンパイルされるのです。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『辞書休むの？』
「休むらしいね」
『休んだらヒット数下がる？』
「下がんないでしょ。 goo で見つかるかどうか、が鍵らしいよ」
『でも goo ってそんなに使ってる人いるのかな』
「あーほら、 yahoo に組み込まれてるから」
『あのページ検索って goo のだったんだ。なんかずっこいね』
「それは違うよ。火美ちゃんもランタイムとか MFC 使うでしょ」
『うおプログラミングの話に振るか！』
「なんでも自分で作らずに、アウトソーシングするのもいいことだよ」
『はぁ』
「だいたい MFC 嫌だからってクラス作らないなんて生産性が……」
『……ってゆーかこれ広告か？』
http://www.kab-studio.com/Programing/Dictionary/
_______________________________________________________________[KCM]


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

　Version 5.17
iostream で文字列操作！

「まずはごめんなさい」
『うおっ、いきなり謝るか』
「まず、インクルードファイルについて。インクルードファイルって憶えて
る？」
『憶えてるよん、 Ver 5.09 ( No.074 ) でやったよね』
「そう、今の FileTestDlg.cpp の最初で」

#include "stdafx.h"
#include <fstream>
#include "FileTest.h"
#include "FileTestDlg.h"

「ってしたよね」
『こうすれば、 fstream の機能が使えるんだよね。それが std::ifstream
なんだよね』
「で、実はここで新しくインクルードしなきゃいけないファイルがあったん
だけど、それを書き忘れてました」
『情けなー』
「ホントはこうです」

#include "stdafx.h"
#include <fstream>
#include <strstream>
#include "FileTest.h"
#include "FileTestDlg.h"

『 strstream っていうのをインクルードすればいいのね』
「今回紹介する std::istrstream を使うのにこれが必要だから。で、今回
紹介するプログラムにもちょっとミスがあったから」

    DWORD dwReadedSize;
    BOOL bRes
        = ReadFile
            ( hFile, chAllLine, 1023
            , &dwReadedSize, NULL );
    if( bRes == 0 && dwReadedSize == 0 )
    {
        TRACE( "ファイルから読みとれませんでした。\n" );
        CloseHandle( hFile );
        return;
    }
// ここまでは前回に解説しました。間違いもない……はず。

    CloseHandle( hFile );

    std::istrstream cStrStrm( chAllLine, dwReadedSize );
    while( !cStrStrm.eof() )
    {
        int i;
        cStrStrm
            >> i;
        if( cStrStrm.fail() )
        {
            TRACE( "整数値じゃないです\n" );
            return;
        }
        char chDest[256]; 
        sprintf( chDest, "%d", i );
        m_cDataLstBox.AddString( chDest );
    }

    return;
// 以下、 iostream のプログラムを取っておきましょう。

『 Ver 5.15 ( No.080 ) と見比べると、 CloseHandle( hFile ) 呼ぶ位置
が違うだけ？』
「そう。 CloseHandle( hFile ) の機能は？」
『 CreateFile() で開いたファイルを閉じるの』
「今回紹介するところはもうファイルの操作しなくていいから、その前に
ファイルを閉じちゃって良かったんだよね」
『つまりそれに気付かなかったと』
「 API は使い慣れてないからな〜。では今回の解説に入りましょう」
『ってゆーか、 Ver 5.10 ( No.075 ) の std::ifstream 使ったのとほとん
ど同じだよね』
「あ、そういえば i を宣言してる場所がばらばらだな〜。まぁこれは今度
解説しよう。そう、 std::ifstream とほとんど同じ」
『違いは？』
「 std::ifstream はファイルから読み取るためのクラスだったけど、
std::istrstream は文字配列から読み取るためのクラス」
『 API 使う例だからって、なんかこういう使い方って変くない？』
「ま、統一されてないのは変だけどね。でもこういう柔軟な使い方できるの
は重要だよ。関数やクラスは〈道具〉として使いこなせなきゃいけないから
ね」
『まーそれはそうだけど』
「さて、まず std::istrstream 型の変数を作ります」
『あれ、でもなんか書き方ちょっと違うね。変数作ってるのに、なんか関数
呼んでる見たい』
「これはコンストラクタっていう、クラスが使える機能のひとつ。クラスは
こんなふうに〈変数を作るときに関数を呼び出す〉ことができるんです」
『変数を作るときに関数を呼びだすぅ！？　はー、器用なことができるの
ねー』
「でも感覚的には int i = 0; みたくするのと同じ」
『よーするに初期化ね』
「そういうこと。ま、今はこういう使い方ができるくらいでいいから。ちな
みに、これは〈変数を作るとき〉に呼び出される関数だけど、〈変数がなく
なるとき〉に呼ばれる関数もあります」
『あーっ、勝手にファイル閉じてくれるってヤツだ！』
「そう、ファイルを閉じたりする後処理をしてくれるのが、デストラクタっ
ていう、変数がなくなるときに呼ばれる関数」
『なんかクラスって便利。だからランタイムや API とかよりも iostream 
や MFC 使った方が楽なのね』
「そういうことになるかな。ま、今は使う段階だから楽だけど、作る段階に
なったら」
『大変なのね……』
「で、 cStrStrm を作るときにコンストラクタを呼び出して cStrStrm の中
身を初期化します」
『第１引数の chAllLine はファイル全体が入ってる文字配列よね。これが
ファイルの代わりになるんだ』
「 dwReadedSize は ReadFile() から受け取った〈実際に読み取った文字列
のサイズ〉。ってことは？」
『ってことは、 chAllLine の中に入ってる文字列のサイズってことね』
「この第２引数で cStrStrm のサイズを指定します。こうすればこれ以上は
み出ないから」
『こーゆーことしなきゃいけないんだ』
「はみ出てるかどうかは次の std::istrstream::eof() で分かります」
『ってゆーか、こっから先は std::ifstream とまったくって言っていいほ
ど同じよね』
「 iostream のメリットはそこだね。同じ系統のクラスなら同じ使い方でい
いっていうのが分かりやすいでしょ」
『まーこれだけ見れば分かりやすいかなー』
「またそーゆーこと言う。さて、ここまでで iostream 、ランタイム、 MFC
そして API でファイル処理をしてきたわけだけど、どう？」
『ってゆーかさ、ファイル操作そのものってどれも同じじゃん、開いて読み
込んでそして閉じるってゆー』
「うんうん」
『それよりも文字列操作の方がめんどかった』
「うん、僕も面倒だった」
『はぁ？』
「 iostream には〈書式化機能〉、つまり整数値や文字列への変換機能も付
いてるわけでしょ」
『そうそう、でもランタイムと MFC は１行ずつ読み込んで整数値に変えてっ
てめんどくさくて、 API なんてファイル全体を読み込むハメに……』
「どうしてもローレベルのライブラリほど、便利な機能が省かれてる傾向に
あるからね」
『ローレベルって低レベルってこと？』
「いや、そういう意味じゃなくて、低層レベルって言った方がいいのかな、
前に〈 API は OS やハードウェア寄りのライブラリ〉って言ったでしょ」
『言ってた言ってた。そういう意味での低層？』
「そう、細かい部分を操作できる意味でね。 iostream はいろんな機能が付
いているぶん、そういう細かいことはできないんだよね」
『やっぱ便利よねー』
「しかーし！！」
『しかぁし？』
「 iostream も MFC も、 ランタイムだって〈低層に高層が重なっている〉
のには変わらないんだよね」
『どゆこと？』
「では、 CFileTestDlg::OnBtnShow() を元に戻しましょう」

void CFileTestDlg::OnBtnShow() 
{
    int i;
    std::ifstream cIFStrm;
    cIFStrm.open( "Data.txt" );    // ここにブレークポイント
    if( cIFStrm.fail() )
    {
        TRACE( "ファイルがない！\n" );
        return;
    }

    while( !cIFStrm.eof() )
    {
        cIFStrm
            >> i;
        if( cIFStrm.fail() )
        {
            TRACE( "整数値じゃないです\n" );
            return;
        }
        char chDest[256]; 
        sprintf( chDest, "%d", i );
        m_cDataLstBox.AddString( chDest );
    }
}

『あ、元の std::ifstream 使ったのだ』
「〈ここにブレークポイント〉ってとこにブレークポイント設置して」
『クリックして手のひらマーク押して実行して【参照】ボタン！　止まった
よ、メモリ見るの？』
「ううん、今回は std::ifstream::open() の中に入ってみます」
『へ？』
「ステップイン……っと、【中カッコに入る】ボタン押して」
『それステップインっつーのね。ほい入った。あ、 Fstream ってファイル
の中みたい』
「そのファイルインクルードしたでしょ」
『あ、そういえば』
「このファイルに std::ifstream::open() の中身があるってことだね。さ
らに入って」
『ほいっと。ん？　同じファイルの違う場所かな』
「ステップイン２回して」
『ほいほい、 Fiopen ってファイルに来たね』
「ステップイン４回でストップ」
『ほいほいほいほい、ってなんも変わんないけど』
「その行って」

    if (valid[n] == 0 || (fp = fopen(name, mods[n])) == 0)

「ってなってない？」
『うんなってる……あれ、もしかしてこの fopen() って……』
「というわけで続く！」

/*
    Preview Next Story!
*/
『 iostream の中にランタイム！？』
「こういうふうに、ライブラリの中には驚きがいっぱい」
『って、なんか水希ちゃんアヤシイ感じ』
「あ、怪しい！？」
『アヤシイアヤシイ！！』
「というわけで次回」
＜ Version 5.18 すべての道は API に通ず！ ＞
『につづく！』
「でもなんかドキドキしてるでしょ」
『うん、なんか冒険してる感じ』
「ふっふっふー」
『……ヤな目ぇ』


/*            ２０００年１１月２０日（月）の更新予定              */
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!!                      */


