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

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

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

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

・KAB-studio.h の広告を取り消し。
　メールマガジン KAB-studio.h のまぐまぐ経由での配信に挿入されていた
広告を、１０月１６日分の配信から取りやめることにしました。
　理由は簡単、広告料が下がったから（爆）。元々就職したら削除する予定
だったんで、それが少し早くなったっていうだけのこと。


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

2000/10/08 (Sun)
　とりあえずドラクエクリア〜。ま、個人的には結構いい感じなんじゃない
かなーと。あとはテレビ色々。パペットマペットがだんだん悪くなって
く（泣）。

2000/10/09 (Mon)
　今日はぷらとわ書いたりドラクエで超ボスに極殺されたり。あーなんか
こーゆーふーにまとめ読み用に書いてると、毎日同じことばっかしてるなー
って気がそこはかとなくするんですよ。つまんない人生よね。

2000/10/10 (Tue)
　久しぶりにガッコに行ってきました。ついでにギルティギアＸしたり美少
女ＣＧテクニックガイドを買ったり。なにぃ、メニューバーがねすけ６Ｐ３
で使えない！？？

2000/10/11 (Wed)
　ドラクエとシネマネー。あとはどーでもいー話。 PE_MTX.A とゆーウィル
ス、 ATOK14 、西武の投手陣は悪くない（なのに優勝できひん……）、いき
なし goo のカテゴリに検索される、とか。ほらね。あとははじめの一歩と
電童いい感じっす！

2000/10/12 (Thu)
　大ピンチ！！　辞書が編集できない！！　 goo のせいで人気のバランス
が崩れる！　メニューバー取り除くの大変！　まぐクリックの広告料激減！
そんな殺伐とした日常を潤してくれるもの、それはミルクケーキ……。

2000/10/13 (Fri)
　辞書問題は解決。ふぅ。辞書はメインコンテンツになりつつあるからねー。
そして青トッポ問題。

2000/10/14 (Sat)
　とうとう来た就職前研修！！　その内容と課題に戸惑いを隠せない鏑矢正
伝に応援のお手紙を！　あと今クールのアニメは粒ぞろい。トライゼノンも
結構いい感じ。


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

2000/10/08 (Sun)
お休み

2000/10/09 (Mon)
お便り
クラステンプレートの型指定に配列は使える？
使えます
「無理矢理代入でコンパイルエラー起こして確認」すれば分かる
テンプレートは「単なる置き換え」
テンプレート引数には「整数値」も使える

2000/10/10 (Tue)
お便り
fgets() と sscanf() での時に
浮動小数型で読み込みチェックした後整数型で読み込むという方法もある
ファイルのエラーチェックはあまりしない
どんなファイルが渡されるか分からないからした方がいいかも

2000/10/11 (Wed)
お便り
DLL で
Microsoft FlexGridControl Version6.0 を乗せたダイアログ
表示されない
まずダイアログだけで表示できるかチェック
表示されなければクラスとかの問題の可能性が高い
表示されたら Microsoft FlexGridControl Version6.0 の問題

2000/10/12 (Thu)
お便り
DLL で表示されないのはリソースをロードしていないからかも
MFC 使っていたからそれに気付かなかった
お便り
メール送信について
通信についてはよく知らない
お便り
std::strstream ではなく std::strstream を使うべきでは？
これはわざと
文字配列を使う std::strstream が一番使いやすい

2000/10/13 (Fri)
お便り
辞書の explicit TCHAR void volatile 仮想関数 の項に疑問
サンプルコード
gcc と bcb なら return で void を返せる
辞書の穴を見つけて

2000/10/14 (Sat)
お休み



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

・追加単語：
サチュレーション ラップアラウンド アウトオブオーダー 分岐予測
インクリメンタルリンク NULL NIL 終端記号 非終端記号 VSYNC パディング
リスト構造 キュー構造 FIFO LIFO FILO ポーランド記法 逆ポーランド記法
MS-DOS サスペンド

・今週の状況：
　おおっ、一気に増えましたねー。某試験の影響か？（爆）
　なんか今回は「もっと詳しく」とかが多くて、足りない部分を埋めるよう
な単語が多かったです。その分、難しい単語も多かったけど（汗）。 CPU 
関係は辛い……。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『うお、長い！』
「他の広告がなくなっちゃったから、その分ね」
『じゃあここも無くしちゃえばいいじゃん』
「それはちょっと……。量多いから、この辺で休止入れないとね」
『中身らしい中身って、ぷらとわとかなゆ〜くらいなのに』
「う”」
『で、ここって何すればいいの？』
「……どうしよう」
『前は STL & iostream 入門の広告だったけど』
「今は再放送モードだしねぇ」
『なんか読者から企画送ってもらおうか！』
「それって CM 違う」
http://www.kab-studio.com/
_______________________________________________________________[KCM]


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


　Version 5.13
MFC でファイル操作！

「これまでに iostream とランタイムで、ファイルから読み込むプログラム
を作ってみました」
『で、今回は MFC を使って読み込む、と』
「そうです。 MFC には CFile とか CStdioFile っていうクラスがあるから、
この CStdioFile を使ってファイルを読み込んでみましょう」
『はーい』
「まず、この前のランタイムの例のように、 CFileTestDlg::OnBtnShow() 
の最初にプログラムを書いて、 return で終了させて、そのあとに iostream
のプログラムを取っておく形にします」
『ランタイムのプログラムはどうするの？』
「削除しちゃって」
『え〜！？』
「……やっぱ、テストプログラムはテストプロジェクトに書いた方がいいね」
『そうよそうよー。まあとりあえず、プログラム他のとこに移しとこ』
「その移したところに、次のようなプログラムを書き込んで」

void CFileTestDlg::OnBtnShow() 
{
    // ファイルを開きます。
    CStdioFile cStdFile;
    BOOL bOpened
        = cStdFile.Open( "Data.txt", CFile::modeRead );
    if( !bOpened )
    {
        TRACE( "ファイルがない！\n" );
        return;
    }

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

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

『どっちかってゆーと、ランタイムの時のプログラムに近いね』
「うん、 sscanf() を使うからその辺でね。まずは最初の部分」

    // ファイルを開きます。
    CStdioFile cStdFile;
    BOOL bOpened
        = cStdFile.Open( "Data.txt", CFile::modeRead );
    if( !bOpened )
    {
        TRACE( "ファイルがない！\n" );
        return;
    }

『まず CStdioFile クラスの変数 cStdFile を作ってるね。クラスだから、
iostream の cStrStrm に近い感じだよね』
「この辺は同じ。 CStdioFile は MFC のクラスだから MSDN に詳しく書い
てあるからね」
『んじゃ次の Open() 。これも std::ifstream::open() とほとんど同じだ
ね。でも微妙に違うとこも』
「まず MSDN で見てみようか。 CStdioFile のメンバ一覧を見て」
『ほい出した。……って、 Open() なんてメンバ関数ないよ？　全部で４つ
くらいしか載ってないし』
「かなり昔の話になるけど、 CWnd と CDialog の関係って憶えてる？」
『ちょっと待って思い出すから……あ、継承ってヤツ！』
「そう、 Ver 3.1 ( No.026 ) や Ver 3.2 ( No.027 ) でやったね。継承関
係にあるときには、子クラスは親クラスのメンバを使えるでしょ」
『だから CDialog は CWnd のメンバ関数も使えるんだよね。……ってこと
は、 CStdioFile にもなんかの親クラスがあって、 Open() はそのメンバ関
数なんだ！』
「そういうこと。その親クラスが、さっき言った CFile 。今のメンバ一覧
の下に【基本クラスのメンバ】ってあるでしょ」
『基本クラス？』
「【親クラス】のことを【基本クラス】とか【基底クラス】とかとも言うか
ら。まあ【 Base class 】の訳なんだけどね。実際は【基底】って訳される
方が多いよ」
『 MSDN ダメダメってことね。んじゃその基本クラス一覧！　あ、 CFile 
のクラスメンバって出た！　ちゃんと Open() もある！』

virtual BOOL Open( LPCTSTR lpszFileName, UINT nOpenFlags,
CFileException* pError = NULL );

『……なんかむっちゃ難しいんですけど』
「まず virtual はかなり難しいから後回し。戻り値は BOOL 、これが 
FALSE だと」
『ファイルなかった！　だよね。 iostream は bool で MFC は BOOL』
「 MFC の方が古いから、 bool 型には対応してないから」
『第１引数は LPCTSTR 、つまり読み取り専用文字列、これがファイル名ね。
次の UINT って……？』
「 UINT は API でよく使われてる型のひとつで、 unsigned int のこと」
『略して UINT ね。〈〜のこと〉ってことは typedef されてるんだよね』
「そう、 API の Include\Windef.h ってファイルに書いてあるからね」
『あら、いつもは調べましょーってなるのに』
「 UINT みたいのはいっぱい引っかかっちゃうから探すの大変だからね。
API 関係の typedef はたいがいこのファイルに書いてあるから」
『ほー。で、この変数の意味はっと、 Flags って書いてあるからフラグに
使うんだね。あ、 fopen() の時の "r" の代わり？』
「そういうこと！　このフラグで、読み取り専用とかを指定します」
『それが CFile::modeRead なんだ』
「 CFile::CFile() ってメンバ関数のページに書いてあるから見てみて」
『結構いっぱいあるねー。ところで CFile::modeRead って、名前空間？
それとも  std::ifstream::open() っての？』
「 std::ifstream::open() の方。 CFile がこんな感じになってるでしょ」
『まって、今ファイル検索で探すから』
「 Afx.h ってファイルにあるよ」
『う〜』

class CFile : public CObject
{
    DECLARE_DYNAMIC(CFile)

public:
// Flag values
    enum OpenFlags {
        modeRead =          0x0000,
        modeWrite =         0x0001,
        modeReadWrite =     0x0002,
        shareCompat =       0x0000,
        shareExclusive =    0x0010,
        shareDenyWrite =    0x0020,
        shareDenyRead =     0x0030,
        shareDenyNone =     0x0040,
        modeNoInherit =     0x0080,
        modeCreate =        0x1000,
        modeNoTruncate =    0x2000,
        typeText =          0x4000,
        typeBinary =   (int)0x8000
        };
// 以下略

『む、ちょっと難しそう』
「ぱっと見でそう考えるの悪いクセだよ〜」
『う”……あ、そういえば enum ってやったね』
「 Ver 4.09 ( No.059 ) でやったでしょ、定数を作る方法」
『こうすると const int みたくなるんだよね。 0x0001 とか 0x0002 とか
って整数をフラグにしてるんだよね』
「 0x01 と 0x02 を、ビットで表すと？」
『えーっと、 00000001 と 00000010 だよね。あ、ビットがずれてるのって
意味あったんだよね！』
「こうすれば | って演算子を使ってふたつのフラグをひとつの値に組み合
わせられるからね」
『 0x01 | 0x02 が 0x03 つまり 00000011 になるんだもんね。詳しくは 
Ver 4.05 ( No.055 ) を参照！』
「この辺も MSDN に書いてあるから。ちなみにこうやって複数のフラグを重
ねられるから Flags って複数形」
『ほー。……ところでー、これ見るとやっぱただのメンバ変数っぽいけど？　
だったら cStdFile.modeRead でもいけそうだけど』
「大丈夫だよ」
『ビルド、あホントだ。じゃーなんでわざわざ？』
「メンバ変数って、クラスの変数ごとに違うでしょ。たとえば cStdFile1
と cStdFile2 があったときに、別々のファイル名が入ってるわけでしょ」
『うん、入ってそう』
「でも enum で作られた定数値は、定数だから」
『どの変数でも値が同じ！！　そういうのは CFile::modeRead ってした方が
いいんだ』
「どっちかって言うと習慣的なものかもね。あともうひとつ。 enum を使っ
てるメリットがないって気付いた？」
『どゆこと？』
「 UINT 型ってことは、どんな整数でも使えるってことでしょ」
『あ！　そういえば、 enum しか使えないとかそういう話あったね』
「この UINT 型が OpenFlags 型になってれば、ここで enum されてるもの
しか使えないから安全。 UINT だとどんな値でも使えるからねー」
『やっぱ MFC ダメダメねー。そういえば、わざわざ unsigned な理由っ
て？』
「 Ver 4.06 ( No.056 ) でちょっとだけ触れたけど、ビットフラグの時は
unsigned にする事が多いかな」
『はじっこのビットが負のフラグになってるとなんかちょっと、ってのね』
「まぁ、基本的にはあんまり変わらないから、その変数が【ビットフラグに
使ってます】っていう意味にしたいときに使うくらいかな」
『えーっと、この第２引数関係はこれで終わり？』
「うん終わり。第３引数の CFileException* pError = NULL はパス」
『ええっ？』
「だって難しいから」
『まー難しいんならしゃーないか。あれ、でもこの部分って、さっきのプロ
グラムで書いてないよね』
「かなり昔教えたことだから忘れちゃったかもしんないけど、引数のあとに
= NULL とかって値を入れとくと、その引数を省略できるから」
『いつやった？　それ』
「 Ver 2.11 ( No.022 ) 」
『うわぁ……。で、省略して書くと、その = の右側のが入れられるわけね』
「そういうこと。実は、 std::ifstream の時もこういうのがあったんです。
MSDN で open を検索してみて」
『ほい。お、いっぱいリストに出てきた……けど ifstream::open があった』
「このページに」

void open( const char* szName, int nMode = ios::in, 
int nProt = filebuf::openprot );

『あとふたつは省略できるから std::ifstream のときは使わなかったんだ。
……もしかして、この省略してるのって "r" とか CFile::modeRead と同じ
意味！？』
「そういうこと。 std::ifstream の便利なとこのひとつだね」
『は〜』

/*
    Preview Next Story!
*/
『なーんか今回、大復讐大会って感じね〜』
「だから字が違うって」
『もっと使い方とか色々教えてよー』
「それよりも、プログラムの理解力を深める方が大事だから」
『というわけで次回』
＜ Version 5.14 手探りと柔軟性 ＞
「につづく！」
『そーゆー地味〜な教えかたすると、人気出ないよ？』
「僕にとっては、火美ちゃんの成長の方が重要！！」
『うお！！』


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

const メンバ関数
#10 意味としての const メンバ関数

　最初の方で「できる限り const メンバ関数化する」ということを言いま
した。 const メンバ関数は、 const メンバ関数と非 const メンバ関数の
どちらからも呼べるから、っていうのがその理由。だから、メンバ変数を書
き換えないメンバ関数があったらそれは即 const 化しちゃっていいわけ。
　でもそうもいかない場合もあります。ひとつは前回見たようなオーバーラ
イドの関係。もうひとつは、意味的なもの。
　たとえば MFC の CWnd::SetWindowText() 。これはウィンドウタイトルを
変更するメンバ関数です。このメンバ関数の中ではメンバ変数は書き換えら
れていないから、 const メンバ関数にすることができたはず。でも実際に
はそうなっていません。
　意味的には、 const になってない理由は分かるでしょ。ウィンドウタイ
トルが変わるわけだから、 const じゃないってことが。でもそれは「意味
の上で」の話。せっかく const 化して、メンバ変数が書き換えられる範囲
を狭められたのに、そうしないっていうのはちょっとね。
　これとは逆のケースっていうのもあります。意味的には const になって
ないとおかしい、なのに実装部で書き換えなきゃいけないから const にな
ってない、っていうの。
　たとえば std::istream::tellg() 。このメンバ関数は「今指し示してい
るポインタの位置」を返すメンバ関数。こういったものは必然的に const 
になるはず、でもなってません。これは、ファイル操作をするときには
fgetpos() を呼び出す必要があって、この関数に渡す FILE * が 非 const 
だから。 FILE * をメンバ変数として持っている場合には、ランタイムの
ストリーム入出力関係の関数を呼び出すメンバ関数は、全部非 const にし
なきゃいけないことになります。
　意味的には const であるべきなのに、そうならない、もしくはその逆、
ってことが多々あるのが const メンバ関数の難しい部分ね。来週は抜け道
について。じゃね。


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


