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

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

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


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

・表紙を６月バージョンに！ 
　毎月恒例、新しい表紙です！
　今回は結構いい感じに仕上がったんじゃないかなーと思います。まー某広
告のパクリですが（汗）。今回の解説はチョー普通な日記５月２８日のを読
んでください。
　ちなみに今回は「壁紙バージョン」も作りました。ダウンロードはCG 
Galleryで！

[チョー普通な日記５月２８日]
http://www.kab-studio.com/cgi-bin/cgiperl7.pl?nikki2/n12_05b.html__s__20000528
[CG Gallery]
http://www.kab-studio.com/CG/Gallery/


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

2000/05/28 (Sun)
　６月表紙完成！　ここ最近こってり風味が多かったからこのシンプルさが
いい感じでしょうと思うのですがどう？

2000/05/29 (Mon)
　授業の単位や履修申告、広告収入の話などもー色々。

2000/05/30 (Tue)
　ゼミへと行くフツーの日々……。それにしても１分間スピーチ用のネタっ
て思ったほどないなー。そして背中痛い……。

2000/05/31 (Wed)
　最終兵器彼女、いい……。そしてヤマトシステム開発の会社説明会兼選考
会へ。はてさて、どうなることやら……。

2000/06/01 (Thu)
　６月は辛い……。まだ背中痛いし。とりあえず本を購入してストレス発散
（爆）。

2000/06/02 (Fri)
　myShade2 でモデリングの練習。こーゆーのはこつこつせなあかんですな。
そしてゼミとか携帯とか。

2000/06/03 (Sat)
　イラスト掲載！　ぽこっと描いたのだけど結構いい感じでない？　あとテ
レビ色々。ラブひなとアウトロースターって似てる？


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

2000/05/28 (Sun)
お休み

2000/05/29 (Mon)
お休み

2000/05/30 (Tue)
お便り
クラスをエクスポートするときの装飾名をなんとかしたい
実行時リンクするときに大変
DLL 内のクラスを GetProcAddress() で使うのは難しい
this ポインタを渡す必要があるから
「クラスプラグイン手法」がおすすめ
COM と同じ仕組み
DLL 内で動的作成して抽象クラスで受け取る
純粋仮想関数を通して関数ポインタを呼び出す
メリットとデメリットあり
装飾名にはクラス名や引数の情報が加わっているからシンプルにできない
「装飾名を出力する方法」があったような気がする

2000/05/31 (Wed)
お休み

2000/06/01 (Thu)
クラス設計を楽しんでできる場合とできない場合がある
クラスは誰のために作るのか
ターゲットを絞れないで作るのはつまらない
KTL みたいなライブラリは絞れてるから楽しい
方向を決めることが大事
向いてない方は捨てることになるから実務でするのは難しい

2000/06/02 (Fri)
ぷらとわを４分の３書く
ポインタを引数に使う部分
参照も
アドレス操作の機能を引数に使う場合にはアドレスという概念がない方がいい
だから参照が作られた
「文章の書き方」みたいなメルマガ書こうかな

2000/06/03 (Sat)
ぷらとわの残りを書く
参照に & を使うと参照先のアドレスが返る
これからの予定
const 参照
ダイアログとリストボックスについての解説をしていく予定


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


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~[KCM]
「あ、先週の広告しわすれた！」
『ってゆーか、この広告ってホントに効果あんの？』
「うーん……」
　あると思う方は購読登録。
http://www.kab-studio.com/Programing/STLiostream/
_______________________________________________________________[KCM]


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

　Version 4.10
アドレスとポインタ

「今日はポインタってものを紹介します」
『ええっ、ポインタ！？』
「ええって、知ってるの？」
『今、ちまたで噂になってるよぉ、ポインタは難しいって！』
「まー昔から言われてるけど、難しいのは〈配列〉にからんだ部分。ポイン
タそのものはかなり簡単だから安心していいよ」
『なーんだ、よかった』
「さてこの関数から」

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

『んーと、これって i のアドレスを表示してるだけだよね』
「そう、変数の前に & を付けると、変数のアドレスになるんだよね。今回
はまずこの〈アドレス〉から。この例だとアドレスを直接出力してるけど、
そうせずに、代わりに変数に入れたい時にはどうすればいい？」
『フツーに int 型変数に入れればいいんじゃないの？』

void AddressToInt()
{
    int i = 100;
    int i2 = &i;    // エラー。
}

『ええっ、ダメなの！？』
「エラーを見てみようか」

error C2440: 'initializing' : 
　'int *' から 'int' に変換することはできません。
　この変換には reinterpret_cast, C スタイル キャスト
　または関数スタイルのキャストが必要です。

「つまり、アドレスっていうのは単なる整数値じゃないってこと」
『……もしかして int * って型なの？』
「そういうこと。アドレスって、変数と密接に関わってるから、特殊なこと
ができないとまずいわけ」
『まずいの？』
「まずいの。というわけで、整数とは別の変数、その名も〈ポインタ〉に入
れる必要があります」

void UsePointer()
{
    int i = 100;
    int *pi = &i;    // これがポインタ。
    TRACE( "%X, %X\n", &i, pi );    // 64F530, 64F530
}

『おー、 int * ってのがポインタの型？』
「そう。ある型のポインタは、その型に * を付けたのが〈ポインタ型〉に
なります。ポインタも型のひとつだから」
『変数が作れる、それが pi なんだ。で、その中に i のアドレスが入る！』
「アドレスを出力するときに i は & を付けなきゃいけないけど pi の方は
付けなくていい、ってとこがポイントね」
『そりゃ pi にはアドレスそのもの、 64F530 とかが入ってるんだもんね』
「そう！　そこ、すごーく大事だから」
『そんな大事？』
「そう。結局は数字入ってるだけってのがね。たとえばこの例」

void ShowPointerAddress()
{
    int i = 100;
    int *pi = &i;
    TRACE( "%X, %X\n", &i, &pi );    // 64F530, 64F52C
}

『あれ？　なんで pi に & 付けてるの？　いらないんでしょ？』
「入ってるアドレスを表示するならね。ここでは pi って変数のアドレスを
表示してるから」
『？？』
「 pi だって変数なんだから、メモリ上に置かれてるし」
『アドレスだってある、それを表示してるのね。なんかややこしい……』
「で、いつも通り止めて、今回はあとの 64F52C のアドレスを見て」
『 pi の中身を見るんだね。ほいっ』

0064F52C  30 F5 64 00 64 00 00 00 8C F5 64 00 42 2E 40 00 2C F8 64 00

『えっと、どうなってるのかな』
「ちなみにポインタのサイズは、アドレスの型に関係なく４バイトだから」
『あーそうだよね、メモリウィンドウのとこって 0x00000000 ってなってて、
１６進数８桁って４バイトだからそうかなーとか』
「お”！　なんかすごい……」
『そ？』
「ちなみにこの４バイトっていうのも、ウィンドウズが３２ビットっていう
のと関係あるから」
『ポインタのサイズ＝ int のサイズ？』
「そういうことかな。ま、とりあえずは４バイトって考えておけば大丈夫で
しょ」
『で、４バイトってことは 30 F5 64 00 まで、 pi の中に入ってるってこ
とだよねこれは……』
「リトルエンディアンだから？」
『逆にして最初の 00 取って 64F530 ……あ！　 i のアドレスだ！』
「そゆこと。つまり、アドレスって値がポインタに入ってるってこと」
『ポインタも変数だから、こういうとこは同じなんだね』
「そう！　何度も言うけど、ポインタにはアドレスっていう数字が入ってる、
ってことすごく大事だから」
『そのイメージを忘れずに？』
「そういうこと。さて次。こっからちょっと難しくなるから覚悟してねー」
『はーい。ま、楽勝っしょ』
「じゃ、この例を見て」

void ReferencePointer()
{
    int i = 100;
    int *pi = &i;
    TRACE( "%d\n", *pi );    // 100
}

『あれ、さっきと２行目まで同じだよね。最後の１行がちょっと違うけど。
ん、結果が 100 ？　アドレスなら 64F530 とかなんない？』
「違うところは、まず %d で出力してるとこ」
『１０進なんだ』
「そして *pi 、つまりアスタリスクが付いてるってとこ」
『え”、もしかして掛け算してるの！？』
「違う違う。 * はポインタと組み合わせて使うと〈ポインタに入っている
アドレスが指し示す変数の値〉を返すの」
『？？？』
「 pi のアドレスはどの変数の？」
『上の i のだよ。これが〈ポインタに入っているアドレスが指し示す変数〉
なんだから、 *pi はこの変数の値……あ、だから 100 なんだ！』
「そういうこと」
『うわっ、なんか混乱！！』
「つまり」

pi  : アドレス
*pi : 指し示す変数

「ってことだね」
『うーん、つまりポインタって、普段はアドレスが入ってるんだけど、 * 
を付けると変数に早変わり！　ってことなんだ』
「そういうこと。いい！？　ぜーったいに、普段はアドレスが入ってるって
こと忘れないでね」
『う、うん』
「普段はアドレスが入ってて、 * を付けたときだけ、指し示す変数になる、
ってこと」
『つまりアドレスがメイン、指し示す変数は一時的ってことね』
「その辺を焼き付けるためにいろいろ試してみます。まず次の関数」

void MovePointer()
{
    int i = 100;
    int *pi = &i;
    TRACE( "%X\n", pi );    // 64F530
    ++pi;
    TRACE( "%X, %X\n", pi, *pi );    // ここにブレークポイント。
}

『ん！？　なんかポインタで足し算してる……』
「関数内５行目にブレークポイントセットして実行！」
『はいっ！　止めたらやっぱメモリ見るの？』
「そ、メモリウィンドウ開いて、３行目で出たアドレスを見てみて」
『うん、見たけど』
「そこの１行、こうなってるでしょ」

0064F530  64 00 00 00 8C F5 64 00 D2 31 40 00 2C F8 64 00 C0 01 52 00

『えーっと、最初の４マス、 64 00 00 00 が i の中身だよね。リトルエン
ディアンだから左の方が小さい桁で、 0x64 って 100 だから』
「そうそう。それを確認したら１行進めて」
『中カッコを飛び越すボタンっ！』

64F534, 64F58C

『って出力されたよ。えっと、ひとつめは pi の中のアドレスだよね。あれ？』
「３行目で pi の中のアドレスは 64F530 ってなってるでしょ」
『で、４行目でそのアドレスに１足してるんだよね。ってことは 64F531 に
なるはずなのに』
「結果は 64F534 、つまり４つ増えてます。なぜでしょー」
『……あてずっぽーで言うけど、 int が４バイトだから？』
「ピンポーン！　実は、ポインタへの足し算引き算は、ただの整数の計算に
はならないんです」
『つまり、ポインタの型のサイズだけ増えたり減ったりするってこと？』
「そういうこと。もしこれが char なら１ずつ増えるし、 short なら」
『２ずつ。でもなんでこうなってるの？』
「これは〈隣の変数を見る〉ため。もうひとつの出力を見て」
『 64F58C のこと？』
「これは ++pi 、つまり 64F534 の場所にある値のこと。このアドレスにあ
る値って？」
『えっと、一番左の 64 になってるマスが 64F530 だよね。 4 多いってこ
とは４マス右だから…… 8C ってなってるマスかな？』
「 int は４バイトサイズだから、そっから４マスは」
『 8C F5 64 00 で、リトルエンディアンだから逆順にして 00 を取ると
64F58C ……ああっ、これが出力されてるんだ！』
「そゆこと。ってゆーか、単純に〈ひとつ先のを表示した〉ってふうに考え
た方がいいかな」
『どゆこと？』
「 ++pi で〈ひとつ隣に移動した〉ってこと。さっきのを分かりやすく４マ
スごとに分けて書くと……」

64 00 00 00 
8C F5 64 00 
D2 31 40 00 
2C F8 64 00 
C0 01 52 00

「ってなるでしょ。こうやって、メモリ上に〈４バイトサイズのデータが並
んでいる〉ってみなすわけ」
『つまり ++ は、アドレス値を増やすってことじゃなくて、ひとつ先に進む
って考えた方がいいのかな』
「そう！　〈ポインタを進める〉って考えたほうがいいね。確認のためにも
うひとつ例を見ておこうか」

void MovePointer_short()
{
    short sh = 100;
    short *psh = &sh;
    TRACE( "%X\n", psh );    // 64F530
    psh -= 1;
    TRACE( "%X, %X\n", psh, *psh );    // ここにブレークポイント。
}

『えっと、、変数が short 型になって、ポインタも short 型。あと……あ、
ポインタから１引いてる！』
「ってことはアドレスはどうなるってこと？」
『 short は２バイトサイズだから、アドレスは２少なくなるんじゃないか
な』
「では試してみましょう。出力結果はこんな感じ」

64F530
64F52E, 64

『 64F52E に 2 を足すと 64F530 だもんね、予想通り！　で、メモリはっ
と』
「ひとつ前だから、ひとつ前の行から見てみると……」

0064F51C  CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC 2E F5 64 00  
0064F530  64 00 CC CC 8C F5 64 00 82 32 40 00 2C F8 64 00 C0 01 52 00

『左下の 64 00 が sh の中身でしょ。その……２マス前だから、右上の 
64 00 』
「あ、結果偶然同じになっちゃったね。ま、そういうこと。こんなふうに戻
るってこともできます」
『まとめっ！　アドレスを入れる変数、それがポインタ。 * を付けると、
そのアドレスが指す変数を見れる、ってことと、足し算引き算をすると、バ
イト数の分だけ増えちゃう』
「ぜーったい忘れちゃいけないのは？」
『ポインタにはアドレスが入ってる！　だよね』
「そゆこと。それだけはぜーったいに、忘れちゃダメだよ」
『はい！』

/*
    Preview Next Story!
*/
『ちょっとややこしいとこもあるけど、そんな難しくないよね』
「そんなこと言っていいのかな〜？」
『う”、いいもん、あたしはがんばるもん！』
「その調子その調子！」
『というわけで次回』
＜ Version 4.11 ポインタとキャスト ＞
「につづく！」
『う”、またポインタですか』
「難しくないんでしょ？」
『そ、そうよっ、がんばるんだから！』


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


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

・KAB-studio.h 縮刷版更新予定。
　 KAB-studio.h が６０号になったので縮刷版を更新したいと思ってます。
あ、更新じゃなく新たにファイル作るかも……。


/*                          ご注意！！                            */

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


