Version 2.11
関数を使おう!
「さて今回は、関数の使い方」
『って、この前作ったのに、使い方なんて楽勝じゃない?』
「それは逆。自分で作った関数だから使えたんで、人が作った関数はどう?」
『確かに、あたしが作ったレシピあげても、誰も料理作んないのよねー』
「……そういえば最近、金菜先輩を見かけない……」
『で、使い方って?』
「そうだね、まずは MessageBox() を使ってみようか」
void CCalcDlg::OnBEqual()
{
MessageBox( "あいうえお" );
}
『これって、確かダイアログ表示するんだよね』
「そ。で、この関数の使い方を調べてみましょう」
『調べるって?』
「まず MessageBox の上でダブルクリックして」
『はい、ダブルクリック』
「そしたらF1キー」
『F1キー……あれ?』
新しくアプリケーションが立ち上がる。〈MSDN ライブラリ Visual C++
6.0〉というウィンドウ名。さらに〈該当するトピック〉というダイアログ
が表示される。
「この中の CWnd::MessageBox() をダブルクリックしてみて」
『ダブルクリックっと』
〈MSDN ライブラリ〉に文章が表示される。CWnd::MessageBox と書かれて
いる。
『これが、 MessageBox() の情報?』
「そういうこと。このアプリは〈MSDN〉って言って、プログラミングに
ついてのいろんな情報が詰まってるんだよ」
『だからこの関数のことも載ってるってことなんだ。……でも、見ても全然
わかんないよ』
「もちろん。これから見方を紹介するから。えっと、こんなふうに書いてあ
るでしょ」
int //戻り値。
MessageBox //関数名。
( LPCTSTR lpszText //引数1。
, LPCTSTR lpszCaption = NULL //引数2。
, UINT nType = MB_OK ); //引数3。
「これは〈この関数をどういうふうに使えるのか〉ってことを表してます」
『使い方マニュアルみたいな?』
「そういうこと。これと、さっきの〈使用例〉を見比べてみようか」
MessageBox( "あいうえお" );
『なんとなく分かるけど……えっと、質問』
「はい、火美ちゃん」
『戻り値、受け取らなくていいの?』
「うん、いいの。前回の Test() のときもね」
『引数の LPCTSTR ってなに?』
「〈文字列〉を入れる変数だよーっていう意味。とりあえず暗記してね」
『だから "あいうえお" っていう文字列を渡せるんだ』
「ちなみにこの LPCTSTR とか int とかを〈型〉っていいます。だからいつ
もの iBox は〈int 型の変数〉ってことだね」
『ふーん。でさ、引数、数合わないけど?』
「実は引数は〈省略〉できるんです。だからこの前の関数を」
int Test( int iBox = 0 )
{
return iBox + 1;
}
「みたいにすると……」
『 = 0 が付いてるね』
void CCalcDlg::OnBEqual()
{
int iBox
= Test(); //引数なし。
TRACE( "戻り値は %d です。\n", iBox );
// 戻り値は 1 です。
}
「みたいに、引数を省略できます。もちろん引数を付けてもいいんだよ」
『省略したら、上のなら0が入ってるってことね』
「そ。こういうのを〈デフォルト引数〉っていいます」
『まんまね〜。じゃ、MessageBox() の2番目の引数、つけていい?』
「うん、やってみ?」
『……引数2つ付けるときって、どうすればいいんだっけ』
「〈 , 〉だよ。TRACE() で使ってるでしょ」
『あ、そうだった。2番目の引数の……かた、も、LPCTSTR だから、文字列
を渡すってことで、ってことは、こう?』
void CCalcDlg::OnBEqual()
{
MessageBox( "あいうえお", "かきくけこ" );
}
『ビルドして実行っと。あ!』
いつもの小さなダイアログが表示されるが、今度はタイトルが「かきくけ
こ」になっている。
『よーするに、ひとつめが中の文で、ふたつめがタイトルってことなのねー』
「ここで、MSDNの方、見返してみようか」
『あ、そっか、ちゃんとこっちに〈2番目の引数はタイトルの文字です〉み
たいなことが書いてあるのねきっと。えっと、〈引数〉の……?』
「第2引数は lpszCaption だったでしょ。そこのとこ読んでみ」
『あ、引数の変数の名前で見るんだ。えっと……』
(MSDNからの引用)
lpszCaption
メッセージ ボックスのキャプションとして使われる CString または NULL
で終わる文字列を指します。lpszCaption が NULL の場合は、デフォルトの
キャプションである "Error" が使われます。
(MSDNからの引用 ここまで)
『いまいち分かんない……用語の違いはいいけど、これ見ても "あいうえお"
渡してってこと、分かんないなー』
「ここでは〈NULL で終わる文字列〉がその意味だから。だから、これが出
てきたら "あいうえお" を渡せるよってしちゃえばたいがい大丈夫だから」
『なーんかしっくりこないなー』
「確かにねー。ただね、この辺には勉強しなきゃいけない部分がいっぱいあ
るんだわ」
『げげ』
「分かればしっくりくるんだけどね。とりあえず、今は我慢」
『はーい。ところでさ、 NULL ってなに?』
「これは〈ぬる〉って読んで、ようするに〈何もない文字列〉ってとこかな」
『そういえば、省略されてるときにこれが渡されてるね……って、あれ?』
「どうしたの?」
void CCalcDlg::OnBEqual()
{
MessageBox( "あいうえお", NULL );
}
『ビルドしてじっこー!』
ダイアログが表示される。タイトルは「CALC」。
『これウソツキ!! Error なんて表示されないじゃん!』
「あ、ホントだ……ま、実際のところ、ドキュメントは信じないで、自分で
試した方がいいってことかな」
『変なの〜』
「しょうがないよ、プログラマーはドキュメントに振り回される生き物だか
ら……」
『なに黄昏ちゃってるのよ』
「じゃーさ、第3引数、なに渡せばいいのかわかる?」
『え……えっと、このウソツキによるとですねー、内容と動作を指定するそ
うです。何かを渡すことで。……なに渡せばいーんだろーね』
「ま、そーゆーことだね。ちなみに渡せるのは、〈メッセージボックス ス
タイル〉のページに書いてあるの」
『あ、リンク張ってあるね』
「 MB_OK とか書かれてるでしょ」
『あ、これ省略された時に渡されてるのだ』
「代わりに MB_ICONQUESTION を渡してみようか」
『はーい』
void CCalcDlg::OnBEqual()
{
MessageBox( "あいうえお", MB_ICONQUESTION );
}
「あ」
『ビルドして実行! あれ? エラー出ちゃったよ?』
「引数は、真ん中だけ省略するってことはできないの。だから第2引数も
ちゃんと書かなきゃダメ」
『めんどー。まあいいけどー』
void CCalcDlg::OnBEqual()
{
MessageBox( "あいうえお", "かきくけこ", MB_ICONQUESTION );
}
『ビルドして実行、っと。あ!』
ダイアログの左側に〈?〉というマークが表示されている。
『へー、ここ変えるだけでこんなふうになるんだー』
「他にもいっぱいあるでしょ」
『あ、ちゃんと MB_ICONQUESTION は疑問符を表示する、って書いてあるね。
あと MB_ICONSTOP とか……』
「そうだ、 MB_YESNO 試してみ?」
void CCalcDlg::OnBEqual()
{
MessageBox( "あいうえお", "かきくけこ", MB_YESNO );
}
『ビルドして実行っと。あ、ボタンがふたつ!』
表示されたダイアログには「はい」と「いいえ」のふたつのボタンが表示
されている。
「このときの関数の戻り値は何かな?」
『え……えっと、どうするんだっけ』
「じゃ、問題」
『げー。えっとねー、まず変数に受け取るのよね……受け取っちゃえば、あ
とは TRACE() で表示すればいいんだから』
void CCalcDlg::OnBEqual()
{
int iBox
= MessageBox( "あいうえお", "かきくけこ", MB_YESNO );
TRACE( "%d\n", iBox );
}
『ビルドして実行。あれ、7だって』
「〈はい〉を選んだら?」
『あ、6! へ〜、選んだボタンで戻り値が変わるんだ』
「そういうこと。これと if で、簡単なアドベンチャーゲームとか作れるで
しょ」
『あ、作れる作れる!! なんか……なんかすごい!』
「ここまで下積みしてきて良かったでしょ」
『うんうん! あれ、でもさ、さっきのアイコンと、このボタンふたつ、一
緒にできないの?』
「そういうときには、〈 | 〉を使います」
『なに、これ』
「¥マークの上、BSキーの左のね」
void CCalcDlg::OnBEqual()
{
MessageBox( "あいうえお", "かきくけこ"
, MB_YESNO | MB_ICONQUESTION );
}
「って感じにすると、一緒に渡せるから」
『へ〜……また分かんなくなっちゃった』
「簡単にまとめれば、引数と戻り値の〈型〉をチェックするのが最優先」
『int だったら int の変数、 LPCTSTR なら文字、みたいな?』
「そう。っていっても最初はそこら辺が難しいんだけどね」
『あと NULL とか | とかも使ったね』
「そんなとこかな。ちょっと難しいけど、どう?」
『うん、難しいけど、関数は面白いかも!』
「ちなみに、関数は昔〈函数〉って書いたんだよね」
『はこだてーって感じ』
「そう、それ!!」
『な、なに?』
「数学のもそうなんだけど、関数って〈データを渡して、処理をして、数字
を返す〉っていうもので」
『MessageBox() なら、タイトルとか渡して、ダイアログ表示して、数字を
返す、ってとこねー』
「そういうのを昔の人は〈数字の出てくる、中身の見えない箱〉に例えたわ
け。で、昔は箱を函って書いたから」
『だから函数?』
「そ。色々あって字体が変わったときに、函が関になっちゃったんだよね」
『確かに、ダイアログ自体、箱って感じするし、箱があって、ボタン押すと、
数字が出てくる……自動販売機みたい』
「実際そんな感じかな。今日は勉強になった?」
『うん!』
「ちなみに今の〈函数〉の逸話はウソです」
『なんですと!?』
/*
Preview Next Story!
*/
「Function に似た音の漢字を当てて〈函数〉、ってのがホント」
『う、ウソつかれちゃうし』
「でも関数のこと、もう忘れないでしょ」
『ま〜、そーだけどさー』
「というわけで次回」
< Version 2.12 ソースファイルとヘッダーファイル >
『につづく!!』
「うわ、イタメールが!」
『……』
「うわ、フリーズした!」
『……』
「うわ、レポートが!!」
『……(ニヤリ)』