{magclick}
{magclick}

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

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

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

{magclick}

/*              まぐまぐ経由配信での広告について                  */

　まぐまぐでの「広告添付方法」が拡張されたことで、メールマガジンの中
に５つの広告を自由にセットできるようになりました。
　というわけで、今号から広告の位置が変わりました。基本的には「表紙ま
わり」と「中ＣＭ」です。表紙はこの上のもの。ここにまず３つ。それと、
「 STL & iostream 入門」のＣＭの前後にひとつずつ計２つ。つまり２ヶ所
に絞って重点的に広告を配置してみました。読みやすさはあまり損なってい
ない配置だと思うんですがどうでしょう。
　ちなみに広告が着くのはまぐまぐ経由で配信したもののみです。 Pubzine
経由のものには広告は付かないのでご安心ください。

[まぐまぐ 広告タグの記述方法]
http://www.magclick.com/ow_adtag1.html


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

・更新なし。
　まだ忙しい……。


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

2000/06/11 (Sun)
　ゼミの英訳中心。なんだかんだ言って、毎週土日ってレポート関係がほと
んど……。あとテレビ色々。相変わらずよく見てる……。

2000/06/12 (Mon)
　エクセルサーガはやっぱ面白いですねー。そして Codian プリントアウト。

2000/06/13 (Tue)
　ＮＥＣフィールディングの会社説明会に行ってきたよー。そのあとゼミが
あったんでちょっとへたれ気味。

2000/06/14 (Wed)
　１年ぶりの「電話が！！」。あとラーメン屋南京亭とか。なんだかんだ
言って、食が日記のネタになること多いなー。

2000/06/15 (Thu)
　NTTインターネットの適性検査＆面接。久々の面接に緊張気味。帰りに世
界堂で文具をいっぱい買って、さらにフツーの高いカレー（爆）。

2000/06/16 (Fri)
　ゼミの代わりの情報通信学会大会とゆーものへ。最初は面白かったんだけ
ど……。そして１００万円。

2000/06/17 (Sat)
　先週に引き続きゼミの英訳とか。そして友人の結婚式の話。しかし！　な
んとここに来て行けなくなるかもしんないとゆー問題が……。はたして！？


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


2000/06/11 (Sun)
お休み

2000/06/12 (Mon)
お便り
リストボックスでエクスプローラーのように選択したい
プロパティを変更すればいい
選択アイテムの取得は CListBox::GetSelItems() などを使う
お便り
後から追加したダイアログを先に表示したい
「プロジェクト名App::InitInstance() 」を書き換え
サンプルコード
#pragma twice の No.026 から No.028 を参照

2000/06/13 (Tue)
お休み

2000/06/14 (Wed)
お便り
複数選択がうまくいかない
フォルダ一覧を表示するには？
コンストラクタについて
複数選択の問題は原因不明
テスト表示で複数選択できるか
SPY++ でスタイルに LBS_MULTIPLSET があるかチェック
フォルダ一覧の取得は FindFirstFile() と FindNextFile() を使用
WIN32_FIND_DATA::dwFileAttributes が FILE_ATTRIBUTE_DIRECTORY か
C++ とウィンドウズの違いに注意

2000/06/15 (Thu)
昨日の補足
FindFirstFile() 系と IShellFolder 系はどちらもメリットがある
前者は使いやすい
後者はメモリ管理が大変
前者はベタにファイルが見られる
後者はネームスペースまわりも見える
組み合わせて使うこともできるけど大変

2000/06/16 (Fri)
信号処理論のプログラムを少し
２重ループは STL は苦手
数学処理は数値指定が多いからイテレーターと合わない

2000/06/17 (Sat)
信号処理論のプログラム
「総和を求めるアルゴリズム」の代わりとなる関数オブジェクト
「総和を出す関数オブジェクト」を作成して for_each() に
m_ = Functional( x, m_ ) を実行する関数オブジェクト
std::binder1st から作成
std::plus 系がすべて使えるから汎用性高い
でも使わなかった
新しいコンテンツ案「 STL コレクション」
汎用性の高い STL アイテムを置くページ


/*             プログラミング辞書・今週の追加単語                 */
http://www.kab-studio.com/Programing/Dictionary/
（６月一杯まで更新を休止します、御了承ください）


{magclick}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
『 STL(略)入門見てると思うけど、 C++ ってホント色々できるよね』
「それが結構問題でもあるんだけどね」
『あ、だから〈初心者は Java 〉とか言われてるんだ』
　それでも C++ なあなたは購読登録。
http://www.kab-studio.com/Programing/STLiostream/
_______________________________________________________________[KCM]
{magclick}


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

　Version 4.12
const 型のポインタ

「ポインタ編もいよいよ大詰め！」
『いつの間にポインタ編？』
「前回はキャストについて見てみたけど」
『型は、どうメモリをみなすか、ってゆーものってことだよね』
「そうそう。で、今日はそれはおいといて、別の話」
『え”、ってことはまた新しいこと憶えるの？』
「そういうこと。まずはこの関数から」

void Sub2Pointer()
{
    int i = 0;
    int *pi = &i;
    *pi = 100;        // ここに注意。
    TRACE( "%d, %d\n", i, *pi );
    // 100, 100
}

『３行目の *pi に注意、ねぇ』
「結果どうなってる？」
『両方とも 100 。……？　両方ともって、 i の方も？』
「ポインタに * 付けると？」
『ポインタが指し示す変数に……ってことは、 *pi = 100 って、 i = 100
と同じこと！？』
「そういうこと。ポインタに * を付けると、ホントに、元の変数と同じよ
うに振る舞うから」
『値取れるだけじゃないんだー』
「実感掴めないなら、メモリで直接見た方がいいかな」
『その方がいいかも。〈注意〉の行にブレークポイント付けて止めてっと』

0064F530  00 00 00 00 8C F5 64 00 E2 30 40 00 2C F8 64 00 C0 01 52 00

『うん、 i には 0 入ってるから４マス分ゼロだね。で、ひとつ進めると』

0064F530  64 00 00 00 8C F5 64 00 E2 30 40 00 2C F8 64 00 C0 01 52 00

『を”、ホントだ……』
「つまり、 *pi と i はまったく同じ物ってこと」
『ほーっ。分身みたいなものってことね』
「それはちょっと違うかな。分身、鏡像、コピー、クローン。これってオリ
ジナルと独立してるでしょ」
『どゆこと？』
「分身を攻撃したら？」
『分身はかき消えて、オリジナルが〈どこを見ている！〉って……あ、 *pi 
は i に影響するから！』
「そう、だからポインタは分身じゃないわけ。例えるなら」
『スタンド！』
「……例えるなら、銀行と ATM 機みたいなものだねっ！」
『無視された……まー確かに ATM 使うと預け入れたりおろせたりできるも
んねー』
「この場合、銀行が元変数 i で、 ATM がポインタ pi 」
『銀行のカードは pi の中のアドレスってとこかな？』
「そんな感じだね。さてさて、実はこれはとっても危険なことなんです」
『とっても？』
「もし i のポインタがいーっぱい作られたら、いつ i が書き換えられちゃ
うかビクビクものでしょ」
『それっていろんな人があたしの口座のカード持ってるようなもんでしょ、
それは怖い！』
「それに、こんなこともできちゃいます」

void BadPointer()
{
    int i = 0;
    int *pi = &i;
    pi[1] = 100;        // ここにブレークポイント。
    TRACE( "%d, %d\n", i, *pi );    // 0, 0
}

『あ、 pi[1] ってことは…… pi[0] が *pi で pi[1] が *( pi + 1 ) だ
から、隣に数字入れてるんだね。……隣ってなんかの変数だっけ』
「ううん、何に使われてるか分からないメモリ上の領域」
『そ、それってまずくない！？』
「もちろんまずいよ。いつも通り試してみて」
『ブレークポイント付けて、実行して、メモリ開いて』

0064F530  00 00 00 00 8C F5 64 00 C2 1B 40 00 2C F8 64 00 C0 01 52 00

『で、１行進めて……』

0064F530  00 00 00 00 64 00 00 00 C2 1B 40 00 2C F8 64 00 C0 01 52 00

『ああっ、右隣が 100 に書き換えられちゃった！』
「これはもちろんまずいこと。何か大事なことに使ってる領域かもしれない
からね」
『隣の人の机に物置いちゃうようなもんよね……』
「もう１行進めると？」
『 i の中身が出るけど、やっぱ 0 のままね』
「じゃ、普通に進めて」
『？　〈実行〉ボタンを押してっと……あ、なんか変なダイアログ出た！』

Microsoft Visual C++ Debug Library

Debug Error!

Program:
（略）Test.exe
Module:
File: i386\chkesp.c
Line: 42

『う”、やっぱさっきのは悪いことだったみたい……』
「【中止】ボタン押せば終了するから」
『うん閉じた。あー、なんかこーゆーのって心臓に悪いなー』
「壊しちゃってるみたいだからね。でも、こうやって操作できるメモリは、
そのアプリ専用のだから、 OS とか他のアプリとかには影響ないから」
『あ、そういうもんなんだね。ちょっと安心』
「で、ようするに〈ポインタを通して書き込める〉っていうのは危険ってこ
と。それは分かった？」
『うん、かなり分かった。で、それを防ぐ方法がある？』
「あるんです。それは const を使うこと」
『 const って Ver 4.09 （ No.059 ）で出てきたのだよね』
「そう、値を変えないようにするの。でも、ポインタで使う const はちょっ
と違うんだよね」

void ConstValuePointer()
{
    int i = 0;
    const int *pi = &i;
    *pi = 100;        // エラー。
}

『？？』
「まず１行目は int 型変数 i を作ってます」
『それは分かるよー。問題は２行目。えっと、さっきのと比べると……』

          int *pi = &i;
    const int *pi = &i;

『あ、 const が付いてるか付いてないかってだけだね』
「そこがミソ。これは」

      int 型変数のアドレスを入れるためのポインタ
const int 型変数のアドレスを入れるためのポインタ

「って考えればいいかな」
『え、だって実際に入れてるの、 const int じゃないじゃん』
「そう、そこが大事。つまり const 型のポインタには、 const 型のアドレ
スだけじゃなくて、非 const 型のアドレスも入れられるってこと」
『そういう仕組みになってるってこと？』
「ポインタを〈読み取り専用〉にしたいからこういう仕組みがある、って考
えた方がいいかもね」
『で、３行目。ビルドするとこの行がエラーになるんだね』

error C2166: 左辺値は const オブジェクトに指定されています。

『ってことは、 *pi が const int って見なされるんだ』
「元の変数は int だけど、ポインタは const int だから、このポインタの
方で見なされるわけ」
『つまり、読み取り専用ポインタを作る時には、 const 型へのポインタを
作ればいいってことねー』
「そうそう、そう簡単に考えた方がいいかも」
『……ふと思ったんだけど、逆ってどう？　 const int を int * に入れた
りとか』
「やってみましょう」
『あ、そうだね。こんな感じ？』

void BadConstPointer()
{
    const int i = 0;
    int *pi = &i;    // エラー。
}

『あ、エラー』

error C2440: 'initializing' : 
    'const int *' から 'int *' に変換することはできません。
    変換で修飾子が失われます。

『へー、これはできないんだ』
「もしこれができちゃうと、 const なはずの i の値が変えられちゃうで
しょ」
『だから、その前の、ポインタの段階でできないようになってるってことな
んだ。でもさ、それはそれで変くない？　直接は関係ないんだから、できて
もいいと思うけど』
「そこが大事。 const って、単に定数を作るためのものっぽいでしょ」
『うん、ただの機能って感じ』
「でも、実際には〈定数としての機能を守る〉っていうことが前提になって
いて、そこから const なんかのルールが決められている、って考えた方が
いいかも」
『つまり、まず最初に〈定数を変えない仕組み〉ありき、 const を const
ポインタに入れられないルールがそこから付けられたってこと？』
「実は C++ にはそういう部分がすごく多いんだよね。一見〈色々使えるた
だの機能〉のように見えて、実は〈ある目的のための機能〉ってことが」
『その辺知らないと難しくない？』
「だから教えてるんでしょう」
『あ……』
「こういうことは、本読んでも分からない部分かもね」
『まとめると』

      int のアドレスを       int * へ
      int のアドレスを const int * へ
const int のアドレスを const int * へ

『は良くて』

const int のアドレスを       int * へ

『はダメ』
「つまり const を非 const にするのはダメってこと。書き換えられちゃう
からね」
『それはつまり、書き換えられないようにそういうルールになってる、だよ
ね』
「そういうこと」
『逆に非 const を const はＯＫね。読み取り専用にしたいから、こういう
ことができるようになってる』
「それはつまり、火美ちゃんが〈読み取り専用ポインタにしたい〉って思っ
たら const 型へのポインタにすればいいってことだからね」
『あ、プログラムを書くとき〈どうすればいいのかな？〉って思ったら、そ
う考えていけばいいんだ』
「そういうこと。言語仕様っていうのは、ちゃんと目的があるってことだね」

/*
    Preview Next Story!
*/
『また新しい概念出てきたねー』
「〈みなし〉の次に今回の〈目的が先、ルールが後〉、かな」
『なんかさー、宗教っぽくない？』
「実際、ものの見方変わっちゃうかもね」
『というわけで次回』
＜ Version 4.13 寿命とポインタ ＞
「につづく！」
『見方変わるとどうなる？』
「常識が亡くなる」
『う”っ……』


/*                       金菜さんの憂鬱                           */
http://www.kab-studio.com/Programing/KanaU/
（現在休止中です、御了承ください）


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

・予定なし。
　もう７月間近！？　色々うまくいかなくてもゴメンね。


/*                          ご注意！！                            */

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


