#pragma twice

KAB-studio > プログラミング > #pragma twice > 014 Version 2.3 変数の中を見よう!

#pragma twice 014 Version 2.3 変数の中を見よう!

前のページへ 表紙・目次へ 次のページへ

 Version 2.3
変数の中を見よう!

ではこの前の続きとして、変数の中を見ていきましょー
はーい
と、その前に!!
な、なに?
今回は変数の中身を見る方法を、みっつ、紹介します
へー、色々とあるんだー
そういうこと。で、とりあえず<仕組み>は考えないで、使い方だけ憶え
てもらいたいなと思ってます
要するに道具としてのみ、ってことよね
そゆこと。じゃ、とりあえずこの前のプログラム

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 100;
}

この関数の閉じカッコをクリックして、この前の<手のひら>アイコンを
クリックして
あのプログラム止めちゃうヤツよね
そ。ちなみにこの●が付いた行を<ブレークポイント>っていいます
コーヒーブレイク、みたいな?
そだね
 "}" の左に "●" が表示される。
そのあとどうするか憶えてる?
もっちろん!!
 マウスカーソルが<紙に書かれた文章、右に下向き矢印>をクリックす
る。プログラムが実行され、ダイアログが表示される。そして、貼り付けて
ある【=】ボタンをクリックする。先ほどの "●" の中に黄色い矢印が表示
される。
じゃ、メニューの【表示】−【デバッグウィンドウ】−【変数】を選んで
みて
ツールバーだと?
<ウィンドウの手前に赤と青の立方体がV字フォーメーション>みたいな
 というアイコンを左クリックする。新たにウィンドウが開く。上に<コン
テキスト>、中に<シンボル名>と<値>の表に "this" や "iBox" が、下
には<自動><ローカル>< this >のタブがある。今は<ローカル>が選
択されている。
あ! この "iBox" ってこの<変数>のことよね。ってことはその右の
<値>には……あれ?
 <シンボル名> "iBox" の右、<値>には "0x00000064" と表示されてい
る。
これはね、この上で右クリックメニューを出して<16進表示>のチェッ
クをオフにすれば大丈夫だよ
じゃーしてみるね
 "iBox" の上で右クリックし、メニューを表示させる。<16進表示>の
左にチェックが入っている。この項目をクリックすると、 "iBox" の右が
"100" になる。
あ、100! へー、こうすると変数の中身が見られるんだー
そういうこと。ちょっとしつこいけど、もう少し見てみようか
見てみるって?
100を他の数字に変えてみるとかね。<実行>アイコンをもう一度押し
てみて
 <紙に書かれた文章、右に下向き矢印>の、アイコン、【実行】ボタンが
クリックされると再び "Calc" ダイアログが表示される。
で、このダイアログも閉じてから、数字を変えてみようか
はーい
 【キャンセル】ボタンが押され、ダイアログが閉じる。VCを表示させ、
"100" の部分を "10000" に変える。
で、ビルドして実行すればいいんだよね
もちろん
 ツールバーの【ビルド】ボタンを押し、現れたウィンドウに<エラー 0、
警告 0>が表示されてから【実行】ボタンを押す。"Calc" ダイアログが表
示され、さらに【=】ボタンを押すとVCが表示され、先ほどの "iBox" の
欄には "10000" が表示されている。
うん、やっぱちゃんと変わってるね
じゃあさ、数字入れなかったら変数の中、どうなってると思う?
とりあえず試してみちゃうね
 
//  iBox = 10000;

 とコメントアウトし、再びビルド、実行する。"iBox" の中身は-858993460
と表示される。
なんか変な数が入ってるね
そういうこと。だから、変数を作ったらまずなにか数字を入れないと、使
えないってこと
え〜? ゼロが入ってるんだと思ってたんだけどなー、めんどそー
ま、それは言えるかな。逆に言えば、そういう部分もプログラマーが自由
にできるってことなんだけどね
ふーん。ねー、めんどいって言えばさー、いちいち止めて見るのって面倒
だけど。止めずに変数の中身見る方法、あるんでしょ?
もちろん。これが一番簡単かな

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 100;
    TRACE( "%d\n", iBox );
}

ふみぃ!? またプログラむー、またわけわかんないのー
言ったでしょ、道具として使うから仕組みはまたあとで、ってね。ま、と
りあえずビルドしてみ?
はぁい
 ビルドし実行する。何も起こらない。
あのー……
ちゃんと出てるよ。ほら、ここ
 マウスカーソルがくるくる回る。下に【ビルド】や【デバッグ】などのタ
ブがあるウィンドウに、確かに "100" という数字が書かれている。
あ、ホントだ、こんなところに。あれ、でもこれって確か……
このウィンドウは<アウトプット>って言って、いろんな結果が表示され
るウィンドウ。たとえば……
 下のタブから【ビルド】を選ぶと、ビルドしたときに表示された<Calc.exe
 - エラー 0、警告 0>などの文が表示される。
このビルドの結果も、アウトプットウィンドウに表示されてたんだよ
へー。じゃーさっきの……確か【デバッグ】タブだったよね
 【デバッグ】のタブを選ぶと、

'C:\WINDOWS\SYSTEM\MFCO42D.DLL' のシンボルを読み込みました

という文が並び、最後の方に "100" という数字が書かれている。
そう。この "TRACE()" っていうのは、この部分に書き込む関数……
関数……?
みたいなもの
何その曖昧なの
ま、今は関数と思って間違いないかな
ってことは、この "TRACE()" っていう関数を呼んで、このところに数字
書き込んで、そしたら戻ってくる、ってこと
そういうこと。もうちょっとこの "TRACE()" の使い方勉強してみようか。
たとえば……

void CCalcDlg::OnBEqual() 
{
    TRACE( "あかさたな\n" );
}

こうすると、<あかさたな>って書き込まれるよ
このまえの "MessageBox()" に似てるね。でさ、最後の "\n" って何?
取ってみたら?
はーい

    TRACE( "あかさたな" );

 でビルドする。実行すると、

あかさたなスレッド 0xFF055839 終了、終了コード 0 (0x0)。

 と表示される。
なーんだ、改行って意味なんだ
そういうこと。さて問題!

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 100;
    TRACE( "iBox\n" );
}

はどう表示される?
 "iBox" 、でしょ
ギク、なんで?
考えたんだけどさ、このまえ<普通の日本語はプログラムの中にあっちゃ
ダメ>って言ってたじゃない。でも【 " (ダブルクォーテーション)】で
囲むと大丈夫じゃない。ってことは、この中ってプログラムとちょっと違う
んじゃない?
げ、その通り。この 【 " 】で囲むと、その中は<文字列>って見なされ
るから、変数とは関係なくなるんだよね
文字列?
そ。これはまた今度かな。じゃ、次の問題。 "iBox : 100" って表示させ
たいときは? あ、"100" っていうのはもちろん
変数 "iBox" の中身、でしょ? 私水希ちゃんみたいなズルしないもーん
はいはい
……ちょっと試してみていい?
もちろん

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 100;
    TRACE( "iBox : \n", iBox );
}

 と書き換えてからビルドする。実行するが "iBox : " としか表示されな
い。
ってことは?
ってことは、やっぱ "%d" ってことよねー
そういうことだね

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 100;
    TRACE( "iBox : %d\n", iBox );
}

 でビルドし実行。今度は "iBox : 100" と表示される。
ふーん、この "%d" っていうのが<あとにある "iBox" の中身を表示しま
すよ>ってことなんだ
そういうこと。で、この変数はいっぱい指定できるから、こんなこともで
きます

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 100;
    int iBox2;
    iBox2 = 200;
    TRACE( "iBox : %d, iBox2 : %d\n", iBox, iBox2 );
    //  iBox : 100, iBox2 : 200
}

へー、最初の "%d" が "iBox" ので、次の "%d" が "iBox2" の、ってこ
となんだ。でもさ、これ、分かりにくいよね。なんか暗号みたいだし
そういえばそんな感じかも……
他の方法ってないの?
あるよ。たとえばね……

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 100;
    CString cStr;
    cStr.Format( "iBox : %d\n", iBox );
    MessageBox( cStr );
}

とりあえず試してみ?
はーい
 ビルドして実行し、【=】ボタンを押す。ダイアログが表示され、そこに
は "iBox : 100" と表示される。
最後の "MessageBox" っていうの、確かダイアログ表示する関数、だった
よね。でも、あのときは " 1 + 2 = 3 " っていうのを渡してたよね
そう。つまり、 cStr が " 1 + 2 = 3 " の代わりになってる、ってことだ

えっと、たぶん…… cStr って、変数?
そう。この "CString" っていうのは、文字列を入れる変数を作るんだよ
ってことは、文字列を作る箱、その名はしーえすてぃーあーるぅ!! み
たいな?
そゆこと
でもそのあとの1行がよく分かんない〜
小カッコの中身は分かるでしょ?
うん、さっきの TRACE() っていうのと一緒だよね。このときみたいに、
%d の中に iBox の中身入れて……?
そうだね、まず、この Format() っていうのは、関数の一種
へ〜
ま、小カッコが付いてたら関数、って思っていいかな
そういえば、 MessageBox も、 TRACE も、この Format も……って、も
しかして水希ちゃん、だから Format() って小カッコ付けて言ってるの?
うん、こうやって付けておけば、それが変数か関数か分かるでしょ?
まーね
で、この関数は CString が持ってる関数なんだわ
? 関数を持ってるの? じゃー int もなんか関数持ってるの?
あいにく持ってないんだよねー。持ってるのと持ってないのがある、って
ところかな
ふーん
で、この<持ってる関数>を使いたいときには、

    変数.関数();

ってします
真ん中の点は?
これはピリオド。これは<の>って考えるといいかな
の?
そ。たとえば< cStr の Format() っていう関数を使います>みたいにね
え〜? < CString の Format() っていう関数を使います>じゃない
の? 
じゃ、これを試してみようか

void CCalcDlg::OnBEqual() 
{
    int iBox;
    iBox = 100;
    CString cStr;
    cStr.Format( "iBox : %d\n", iBox );
    CString cStr2;
    cStr2.Format( "%d in iBox\n", iBox );
    MessageBox( cStr );
    MessageBox( cStr2 );
}

えっと、ビルド、実行と
 ダイアログが2度表示される。1度目は "iBox : 100" 、2度目は "100
in iBox"。
もう分かってると思うけど、 Format() っていう関数、 TRACE() のとき
みたいには %d の中に iBox の中身を入れたあと、それを cStr の中に入れ
てくれるんだけど……
つまり、 cStr と cStr2 には別の文が入るわけだから、 cStr.Format()
って形にしないといけない、 CString.Format() じゃダメってことね
そういうことだね。こういう関数を使うと、変数を操作できるってこと
こういうのも、道具のひとつってこと?
そういうこと
でも、こういうの憶えてくのなんか大変。今回のだけでも、憶えられるか
どーかちょっと不安……
大丈夫だよ、当分新しく憶えないから
ホント?
ホント。実際、これだけのこといっぺんに憶えるのは大変だと思うから、
分かんなくても心配しなくていいよ
そういうもんなの?
そういうもの

/*
    Preview Next Story!
*/
今日はなんか、頭がウニになっちゃいそう……
ま、ちょっと先見過ぎた感じかな
じゃ、今度はもうちょっと簡単なの?
たぶんね……
というわけで次回
< Version 2.4 計算をしてみよう!! >
につづく!!
ねーはっきし言ってあたしものすごーく不安なんだけど
大丈夫だよ、少しずつ憶えてけばいいんだから
じゃなくて、購読登録数減っちゃうんじゃないかって
う”、確かに……
 
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
RSSに登録
del.icio.us 登録する
Yahoo!ブックマーク 詳細を表示 users
livedoorクリップ 詳細を表示 livedoorクリップ ブックマーク数
はてなブックマーク 詳細を表示 はてなブックマーク ブックマーク数
 
このページは、Visual C++ 6.0を用いた C++ 言語プログラミングの解説を行う#pragma twiceの一コンテンツです。
詳しい説明は#pragma twiceのトップページをご覧ください。