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

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

    送信日： 2000/11/20(Mon) No.083
    配信数： 3870（ 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/nikki2/

2000/11/12 (Sun)
　毎週恒例・アンケートクイズの結果！　そして毎週恒例じゃなくなった。
そして goo と google サイト内検索対決の結果やいかに。

2000/11/13 (Mon)
　GW から DTP World に乗り換え。ゼミでへろへろ。スポーツパンツって高
いのね。そして地域差。東京のメリットとわ……。

2000/11/14 (Tue)
　ゼミの第２回中間発表作成中。就職前研修(CD-ROM)も。そして急転直下の
アクセスランキング。っつーか、結構各ページ増減激しいなぁ。

2000/11/15 (Wed)
　就職前研修（出向）２日目、アルゴリズムの前半。 BCC5.5 と CPad for 
bcc でバリバリプログラミング〜。これでヒマをつぶせた（爆）。でも疲れ
た〜。

2000/11/16 (Thu)
　就職前研修（出向）３日目、アルゴリズムの後半。甘く見てたら解けない
問題が結構あった（汗）。そして吹き矢。

2000/11/17 (Fri)
　とーとつですが、１２月はプログラミング強化月間とします。ホームページ
管理用アプリケーションを作るんで。ちゃんとしたの作るの久しぶり〜。

2000/11/18 (Sat)
　ギルティギアとギルティギアゼクスは違うのでギルティギアを練習しても
ギルティギアゼクスはあまりうまくなりません。だからドリキャス欲しい。


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

2000/11/12 (Sun)
お知らせ
Codian に iostream の #07 から #10 を追加
プログラミング辞書
継承の項目が間違えていたので修正

2000/11/13 (Mon)
お休み

2000/11/14 (Tue)
お便り
プロファイラの使い方
/profile をセット
STL std::vector の T0 型、 T1 型って？
省略してある文がありそう
string -> char* の変換は char 配列にコピーし直す必要あり？
std::string::begin() で取得できるはず
命名規約の例は？
KTL のページにある
メンバテンプレートをクラス定義の外で定義するには？
VC6 ではできない

2000/11/15 (Wed)
お便り
うまくいかない原因にテンポラリ変数がある
お便り
std::string::begin() はイテレーターを返すから char * はダメ
while ((input_char = getchar()) != '\n') 
これはループを解りやすくする
std::string にコピーするクラス
サンプルコード

2000/11/16 (Thu)
お便り
std::string 内のサイズが変わるとまずい
文字列型があってもいいのに
お便り
std::string から char * を取得することが間違い
std::auto_ptr<> の配列版 auto_array<>
サンプルコード
結局クッションが必要

2000/11/17 (Fri)
お便り
string::operator[]() は string::reference 
を返すからそこから char *
サンプルコード
今の問題は「動く」より「規格」
お便り
SHGetFileInfo() でアイコンの入ってるファイルを取得したい
うまくいくときといかないときがある。
場合ごとに分けるしかないかも

2000/11/18 (Sat)
お休み


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

・追加単語：
なし。

・今週の状況：
　現在、単語の受付をお休みしてますー。受付再開は来週２７日。あと１週
間です。

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

テンプレート
#03 「関数テンプレート」のこだわり

　前回の復習とまとめ。

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

　この関数テンプレートは、まだ関数じゃありません。使った時点で、与え
られた引数の型によって「テンプレート引数」の単語が特定の型に置き換え
られます。

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

　このプログラムは、実際にソースコード中のものが書き換えられるわけ
じゃないってことに注意してね。コンパイルの記憶領域中にこういうプログ
ラムが作られるわけ。これが関数テンプレートのインスタンス化。この時点
で関数テンプレートが関数になって、コンパイラにコンパイルされます。
　関数テンプレートは、使われるまでコンパイルされません。

template< class type_hatena >
void Increment( type_hatena p_hatena )
{
    ???;
}

　謎の ??? 、どうみてもコンパイルエラーになりそうなのに、この関数テ
ンプレートが呼び出されない限りコンパイルエラーになりません。呼び出さ
れていなければ、コンパイラが無視するからです。
　テンプレートにこだわりのある人は、特別な場合を除いて「テンプレート
関数」とは言いません。それは、関数テンプレートは「関数じゃない」から。
関数テンプレートはあくまでテンプレートなんです。コンパイルの対象にな
る関数じゃないんです。呼び出されて、インスタンス化されて初めて関数に
なります。人によってはこのインスタンス化されたものを「テンプレート関
数」って言うかな。来週は引数の指定について。じゃね。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『ホームページの管理って大変なのかな』
「専用のアプリ使えば問題ないんじゃない？」
『え？？　それが普通なんじゃないの？』
「自分で中身を直接書くって人もいてね」
『あ！　それって AppWizard に作ってもらうのと』
「……自分でコーディングするのってこと？」
『そー考えるとバカよねー、わざわざ作ってもらえるのに』
「いやー、いつかその考えも変わると思うよ」
『やっぱホームページは自分で書けってこと？』
「いや、そっちじゃなくて」
　１２月はプログラミング強化月間！
http://www.kab-studio.com/nikki2/
_______________________________________________________________[KCM]


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

　Version 5.18
すべての道は API に通ず！

「というわけで、 std::ifstream::open() の中を見ていったら」

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

「というコードが出てきました」
『この fopen() って、ランタイムの fopen() ？？』
「そう、つまり iostream はランタイムを利用してファイル入出力をしてる
んです！」
『へーっ、ま、 iostream は標準 C++ ライブラリ、ランタイムは標準 C ラ
イブラリ、使っててもおかしくないけど……でもそういう古いの使ってるっ
ていうのはやっぱ不思議かも』
「古い新しいっていうより、ローレベルハイレベルってことかも」
『前回の話ね。ファイル使うのはローレベル、クラス使って便利にしてるの
がハイレベル』
「 iostream はハイレベルの部分として使いやすくしてる、で、ローレベル
の部分は昔ながらのランタイムに任せてるってことだね」
『そういうもんなんだ』
「さて！　今度はこの fopen() の中に入ってみましょう！」
『ええっ、入れるの？』
「 Visual C++ にはランタイムのソースファイルが付いてるからね」
『……ソースファイル……』
「宣言が入ってるのがヘッダーファイル、定義が入ってるのがソースファイ
ル」
『あー、 .h と .cpp ね』
「ランタイムのソースファイルには定義部、つまり関数の本体が入ってるか
ら、それを見て fopen() がどうなってるか見てみましょう」
『難しくない？』
「難しい部分は無視しましょう」
『うっ適当……』
「えっと、今の std::ifstream::open() の中の fopen() から入ってもいい
し、 fopen() 実際に呼び出すコード書いてそっから入ってもいいけど」
『 std::ifstream::open() からいこっとブレークポイント設置！』
「んじゃ入って」
『【中カッコに入る】ボタンでステップイン！　_tfopen() って関数に入っ
た』
「これが fopen() の中身だね。【中カッコに入る】ボタンを２回押して」
『 _tfsopen() に入った』
「下の方に」

    retval = _openfile(file,mode,shflag,stream);

「って行があるからこの _openfile() に入って」
『【中カッコを飛び越える】ボタンを……』
「あーっと、それでもいいけど、この行をクリックしてから【カーソル行の
前まで実行】ボタン押してもいいかな」
『それどのボタン？』
「【中カッコの左上に右向き矢印】のボタン」
『ぽちっと。あっ一発で！』
「他にもブレークポイントを設置して実行ボタンとかね」
『よーするにいろんな方法でできるようにってことね』
「そゆこと」
『んじゃ _openfile() の中へゴー！』
「下の方に」

    if ((filedes = _tsopen(filename, modeflag, shflag, CMASK)) < 0)

「があるから」
『 _tsopen() の中に入ればいいんだよね、クリックして【カー（略）実行】
で……っとなんか変なダイアログ出た！』
「【あいまいさの解決】ダイアログだね。似たような関数がふたつあって、
Visual C++ がどっちか判らないときにこのダイアログが出ます」
『あたしもわかんない〜』
「こういうときは、頭に w が付いてない方を選んで」
『じゃー _openfile() っての。ん、どうなったのかな？』
「 _tsopen() のある行まで来たから」
『あ、そっか、じゃーステップイン！』
「この _tsopen() の下の方に……」

    if ( (osfh = CreateFile( (LPTSTR)path,

「って行があるでしょ」
『うん、んじゃこの行まで飛んでステップ』
「ちょいまちっ！」
『な、なに？　CreateFile() の中に入るんじゃ…… CreateFile() ？』
「どっかで聞いたこと」
『ああっ！！　これって…… API の CreateFile() なの？』
「そゆこと。やっとたどり着いたね」
『ど、どーゆーこと？』
「つまり、 fopen() でファイルを開くってことは、間接的に CreateFile()
を呼んでファイルを開くってこと」
『……つまりランタイム使ってると思ったら、ホントは API 使ってたと』
「そういうこと」
『ってことは iostream も API 使ってるってことで……あのーもしかして』
「うん、 MFC も API 使ってる」
『ええ〜！！　なに、結局ファイル開くのって API 使ってるってことな
の！？』
「あ、もちろん開くだけじゃなくて、ファイル入出力は全部 API 使ってる
んです」
『なんか……ちょっと驚いたかも』
「驚く前に MFC の方も確認しておこうか。とりあえず【実行】ボタン押し
て」
『フツーに動くようにしてダイアログ閉じて、ね』
「そしたら」

void CFileTestDlg::OnBtnShow() 
{
    CStdioFile cStdFile;
    cStdFile.Open( "Data.txt", CFile::modeRead );
    return;
// 以下取っておきましょう

『いつものパターンね』
「テスト用だから開けたかどうかのチェックはナシ。じゃ、 
CStdioFile::Open() 呼んでる行にブレークポイントを設置して」
『ステップイン！　CStdioFile::Open() に入った』
「６行くらい下に CFile::Open() を呼んでるところがあるから」
『これにステップイン！　これって、いわゆる親クラスのメンバ関数に入っ
てるんだよね』
「そうそう、ファイル開いたりする機能は親クラスの CFile の方にあるから
ね」
『 CFile::Open() の中に入って……ああっ！！』

    HANDLE hFile = ::CreateFile(lpszFileName, dwAccess, dwShareMode,

「というわけで、 MFC も API を使ってファイルを開いていましたとさ」
『めでたしめでたし、ってあのねー』
「簡単にまとめると」

iostream  > fopen  > CreateFile
CStdioFile::Open() > CreateFile

「って感じだね」
『最終的に API 呼んでるっていうのは、さっきのローレベルって話？』
「そういうことだね。まず基本的に、ファイル操作ってのは危険なことだっ
ていう認識が必要」
『そりゃそうよね、ウィンドウズの重要なファイルとか、間違えて書き換え
ちゃったりしたらまずいわけだし』
「だから、ファイル操作は API でしかできないようになってるわけ」
『 API 以外にはファイル操作する方法がないってこと？』
「さらにローレベルな機能使えばあるけど、基本的にはそういうこと。 API
だけが〈ファイル操作のための手段〉として提供されているわけ」
『そうやって問題が出ないようにしてるんだ』
「だから、ランタイムも iostream も MFC も、ファイル操作をするときに
は API を呼んでるわけ」
『ランタイムなんてなんか直接してそうだったのに』
「ランタイムだって人の作ったものだからね」
『どゆこと？』
「ライブラリの作られる順番は、 API が最初。まず API が作られます」
『うんうん』
「次にランタイムを作ります。ランタイムを作る人は〈ファイル操作をする
ときには API を使うんだ〉ってことを知って、 API を使うプログラムを組
むわけ」
『そっか、ランタイムだってそーゆーふーにプログラムとして作られるんだ
もんね』
「 iostream も MFC もそう。ライブラリって最初からあるし何気なく使え
るから〈なんかすごい〉とか思うかもしれないけど、所詮人の作ったもの」
『確かに』
「得体の知れないことしてそうでも、実際はそうでもないってことをちゃん
と分かっておいて」
『つまりライブラリの中身を見ようってこと？』
「それもひとつ。分からない部分も多いと思うけど、積極的に見ていって欲
しいかな。数少ない〈自分以外の人が作ったプログラム〉だしね」
『例にいいってことね。もうひとつは？』
「ランタイムとかは見られるけど、 API の中身は見られないから」
『あ、そういえばそうだよね。ソースファイル公開してないから？』
「 API の中身はすなわちウィンドウズの中身、だからね」
『あーそーいえばそーゆー訴訟してたね』
「で、 API の中身は見えないけど、見えなくったって、結局は得体の知れ
ないことしてるわけじゃないんだ、っていうことを憶えといて」
『 API の中身だって、誰かが作ったプログラムなんだ、ってこと？』
「そういうこと！　まずは、どんなアプリもプログラムも、自分と同じプロ
グラマーが作ったんだっていう認識が大事」
『つまり、自分にだってそういうものは作れる！』
「そこまでは言えないけど、でもそういう考えは重要。とんでもない変なこ
としてるわけじゃなく、ちゃんとしたプログラムなんだっていうイメージが
重要だね」
『まとめ！　結局 API を呼んでファイル操作してる！』
「 API だけでできるようになってるってこと」
『ランタイムとかも、意味不明な操作じゃなくて、 API を使うっていう普
通のことをしてファイル操作してる！』
「だから、どんなプログラムも普通のプログラムなんだ、って思いましょう」

/*
    Preview Next Story!
*/
『そんな感じのこと、 LPCTSTR の時も言ってたよね』
「重要なことだから何度もってことで」
『だからどんどん長くなるんじゃない？』
「ぎくっ」
『というわけで次回』
＜ Version 5.19 ファイル読み込みをブラッシュアップ！ ＞
「につづく！」
『ってゆーか Ver 5 っていつまで続くの？』
「もうすぐ半年になっちゃうね……」


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


