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

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

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

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

・更新なし。
　ヤバイです。まずいです。あうーです。


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

2000/06/18 (Sun)
　Ｋの結婚式とゼミ合宿が被るかも？　から実はゼミ合宿日程が未だ決まら
ない事態に（汗）。

2000/06/19 (Mon)
　NTTインターネット１次選考通過！　つってもまだまだ先は長い……。あ
とラジオ。この日記はラジオを意識して構成しているのです。たぶん。

2000/06/20 (Tue)
　コミュニティネットワーク関係で毎週火曜は遅いのよ。

2000/06/21 (Wed)
　会社説明会関係２連ちゃん！　午前中はソースネクスト、午後は国際シス
テム。大変ですー（泣）。

2000/06/22 (Thu)
　ガッコ行ってからNTTインターネットの面接。はたして結果は？？　そし
て謎のカラス。

2000/06/23 (Fri)
　国際システム１次選考通過！　でもやっぱ先は長い……。そしてゼミ掃除。

2000/06/24 (Sat)
　勉強とか宿題とか色々。相変わらず忙しい日々です（泣）。



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

2000/06/18 (Sun)
ぷらとわ書き
const 参照関係
概念的理解は必要だと思う

2000/06/19 (Mon)
Ｃマガジン購入
「プログラミングの禁じ手Ｃ＋＋編」は Effective C++ 必須
Effective C++ はあまり有名じゃないような気が
gcc でコンパイルチェック
VC のツールとして gcc を呼び出す
アウトプットに結果が表示される
非常に便利

2000/06/20 (Tue)
お便り
VC を使いこなす
Effective C++ の知名度

2000/06/21 (Wed)
お休み

2000/06/22 (Thu)
お休み

2000/06/23 (Fri)
お休み……

2000/06/24 (Sat)
信号処理論のプログラム
ファイルデータの書き込み
EUC で保存


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


{magclick}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
「まだ火美ちゃんには STL は早すぎるかな」
『でもそれって、ホントは使わなくていいってことじゃない？』
「ぎくっ！！」
　それでも使いたいあなたは購読登録。
http://www.kab-studio.com/Programing/STLiostream/
_______________________________________________________________[KCM]
{magclick}


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

　Version 4.13
寿命とポインタ

「前回は const 型へのポインタっていうのを見てみました」
『定数ってものを使いたいからそーゆー仕組みがある、とかって話だよね』
「そうそう。で、今回はそれと関係しつつちょっと違う話」
『う”、また憶えることが……』
「まずはこの関数から」

void LocalVariable()
{
    int i = 0;
    TRACE( "%X\n", &i );
}

// 下の関数を呼びだしてください。
void CallLocalVariable()
{
    LocalVariable();    // ここにブレークポイント。
}

『ん？　下の関数って、上の関数を呼んでるだけだよね』
「そ。とりあえず試してみて」
『はいっ。んと、 LocalVariable() 呼んでるところにブレークポイントを
セットして、ビルドして実行、ボタン押して、止まったよ』
「そしたらその関数の中に入って」
『【中カッコに入るボタン】で上の LocalVariable() にステップイン！』
「そしたら１行ずつ進めて」
『【中カッコを越えるボタン】を１回、２回』
「３回押したらいつものように」
『アウトプットの i のアドレスを見るんだよね。メモリウィンドウを開い
てっと』

0064F4DC  00 00 00 00 34 F5 64 00 CD 30 40 00 8C F5 64 00 C0 01 52 00

『うん、今は i が 0 だからそうだよね』
「そしたらもう１行進めて」
『関数から出て、 CallLocalVariable() に戻る……あ！』

0064F4DC  0D 38 40 00 34 F5 64 00 CD 30 40 00 8C F5 64 00 C0 01 52 00

『 i の中身、変わってる！！　なんで？』
「これは、中カッコの中で作った変数は、中カッコから抜けると削除されちゃ
うから」
『中カッコ？』
「あ、それだと難しいか。もう少し絞って言うと、関数の中で作った変数は、
関数から抜けると削除されちゃうってこと」
『え、そうなの？』
「そう。こういう変数を【ローカル変数】って言って、ローカル変数は関数
の中でしか寿命がないわけ」
『関数抜けると死んじゃうんだ』
「まー表現的にはあってないんだけどね。ローカル変数が使ってたメモリ領
域は、他の変数が使うから」
『引っ越した家を他の人が使うって感じ？』
「そんな感じかな。これを踏まえて、次の〈間違った例〉を見てみましょう」
『間違った例？』

int *RetBadPointer()
{
    int i = 0;
    TRACE( "%X\n", &i );   // ここにブレークポイント。
    return &i;             // 警告が出ます。
}

// 下の関数を呼びだしてください。
void CallRetBadPointer()
{
    int *pi = RetBadPointer();
    *pi = 100;
}

『ビルドしたら警告出たよ』

warning C4172: ローカル変数またはテンポラリのアドレスを返します。

『あ、そういえば RetBadPointer() の中でローカル変数のアドレス返して
るね』
「そう、ポインタも戻り値にできるから。で、さっきみたくメモリ見てみて」
『んっと、アドレス見て、そこ表示させて』

0064F4D8  00 00 00 00 34 F5 64 00 8D 38 40 00 8C F5 64 00 C0 01 52 00

『で、 return で i のアドレスを返してっと。あ、確か返すとそれで関数
も終わるんだよね』
「そうそう」
『こうやって return して関数が終わると、関数がその変数になるんだから、
int *pi = &i; みたいな意味になるんだよね。……？』
「メモリはさっきみたいに」

0064F4D8  60 38 40 00 34 F5 64 00 8D 38 40 00 8C F5 64 00 C0 01 52 00

『……ねぇ、ってことはさ、 RetBadPointer() から返ってきたときにもう
i はなくなってるんでしょ？』
「そう」
『ってことは pi に入ってるアドレスって』
「 i の元あったアドレス、つまり今は何に使われてるか判らないアドレス
ってことだね」
『そそそそれってやばくない！？』
「ヤバイよ。そのあと pi を通して i の元あったとこに値入れてるけど、
これはやっちゃいけない例」
『そそそ、そうよね、ご老人がいることを確認して強盗に入ったらヤクザさ
んの家だったなんてシャレになんないじゃん！』
「それはどう転んでもシャレになんないよーな」
『じゃあ〈そこのドアを開けたらお化けが！！〉〈がちゃっ。いないやん〉
みたいなドリフチックなのは？』
「それだ！　じゃなくてー」
『じゃなくて？』
「つまり重要なことは、関数の中で作ったローカル変数を、戻り値として返
しちゃダメ！！　ってこと」
『しちゃいけないことができちゃうの？』
「だから警告出たでしょ」
『あ、そっか』
「でも、実行したときにエラーが出ないから、その点には注意」
『それってテストしてもわかんないってことだよね』
「そうそう」
『……ふと思ったんだけど、実行して問題ないんなら、いいんじゃない……
ってのはもちろんまずいって思うんだけどさ』
「そうそう」
『水希ちゃん流に言うなら〈手術中に１円玉落ちちゃった、まー問題ないか
ら取らないでいいや〉みたいな感じ？』
「なんで１円玉……」
『まーでも、なんかちゃんと動いてるっぽいからいーやん、みたいな感じは
ちょっとするよ』
「そう、〈分からないと〉みたいな部分があるからね。たとえば環境ホルモ
ンが出る製品を使うのとかって」
『そういうのって見えないから気にならないとかあっちゃうかもしんないね』
「でも密かに影響あったりするでしょ」
『そういうものってことなんだ。確かに、この例じゃ影響でなくても、おっ
きなプログラム組んだりして、長い間使ったりしたら、影響出るかもしんな
いんだもんね』
「だから重要なのは、仕組みをちゃんと理解してて、なんでいけないのかっ
てことをちゃんと分かってるってことが大事」
『あたし達は整備士。車にはガソリン、じゃなくて、なんでガソリンじゃな
きゃいけないのか、が分かってないといけないってことね』
「そゆこと」
『あっそうそう、でさ、結局ローカル変数ってなくなっちゃうんだから、戻
り値としてポインタを返すのってダメってことだよね』
「そうとは限らないよ。外の変数のポインタを返すことはできるから」

int *RetPointer( int *p_pi )
{
    return p_pi;
}

// 下の関数を呼びだしてください。
void CallRetPointer()
{
    int i = 100;
    int *pi = RetPointer( &i );
    TRACE( "%d\n", *pi );    // 100
}

『うわ、 RetPointer() って面白い！　ポインタ受け取って、すぐ返しちゃ
うんだ』
「ま、アドレスを値って考えて、それを受け取って返すだけ、ってことだね」
『通ってるアドレスは、他の関数の変数なんだ。あ、これは大丈夫なんだね』
「そう、ローカル変数は〈関数が終了したら消える〉から、終了しない限り
なくならないわけ」
『で、通ってきたアドレスを受け取って表示したら i と同じ、ね』
「そういうこと。あと、ちょっと難しいけど〈変数を動的に作成する〉って
こともできて、そのときにはポインタを返せるから」
『どゆこと？』
「こういうこと」

int *RetNewPointer()
{
    return new int;
}

void UseRetNewPointer()
{
    int *pi = RetNewPointer();
    *pi = 100;
    TRACE( "%d\n", *pi );    // 100
    delete pi;
}

『うわあああっ！　なんかいきなりむずかしチック！』
「うん、実際そうだと思うからちゃんとした解説は今度ってことにするけど、
とりあえずどう？」
『 new と delete っていうのが初見……』
「 new は、特殊な方法で変数を作るためのもの。こうやって作るとローカ
ル変数とは違う別のタイプの変数を作ることができて」
『それは関数から抜けてもなくならない？』
「そういうこと。だから関数の外でも平気で使えるんだけど、逆に使い終わ
ったら削除しなきゃいけないっていうデメリットがあるわけ」
『それが delete ？』
「そうそう。こういう方法なら、ポインタを返すことができるでしょ」
『うん、ってゆーか聞けば簡単、かな』
「そうでもないよー。たとえば、 delete する前にアドレスが消えちゃった
ら？」
『削除できない……』
「 delete したのにアドレスが残ってて、そこにアクセスしちゃうとか」
『あわわわわ……』
「ってことで、ただ使うのは楽でも、使いこなすのにはいろんなテクニック
が必要だから」
『確かにねー、ローカル変数ならそういう心配はいらないんだもんね』
「ま、色々注意しなきゃいけないのは、普通にポインタ使う時も同じ」
『つまり〈あ、ポインタを返しちゃいけないんだ〉とかってことを常に気を
付けておく必要があるってこと？』
「そういうこと」

/*
    Preview Next Story!
*/
『ポインタって注意必要怪我一生って感じ』
「それはどんなに熟練してもそう」
『げ、これからもずっと心配し続けなきゃいけないの？』
「そのために、安全性を高めるテクニックがあるんだな」
『というわけで次回』
＜ Version 4.14 引数に使うポインタ、そして参照 ＞
「につづく！」
『テクニック使ったら心配事増えたりして』
「ぎくっ……」


/*                       金菜さんの憂鬱                           */
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!!                      */
