main関数内で、自作の関数keisan()を呼んでいます。この時、
keisan関数のカッコの中に、引数が書かれていますが
この場合、各引数には実際の値を持っていなくてはいけません。
これを、実引数(argument)と
いいます。kingakuやzeiritsuは、すでに値を持っていますが、
nedanは宣言しているだけで、実際の値を持っていません。
(と、いうか何が入っているかわからない)
では、この間違ったプログラムをコンパイルしてみましょう。
あー、やっぱり注意されました。
スペースの関係でWINDOWを小さくしていますが、
warning C4700:のあとには、
値が割り当てられていないローカルな変数 'nedan' に
対して参照が行われました。
と、おかしな所を指摘されています。
でも、warningだけで、エラーにはなっていないので
EXEファイルは作られています。(オプションでWarnings as Errors
をチェックしていない場合。)
では、このプログラムを正しく直してみましょう。 やり方は、いろいろあります。 ここでは、せっかく自作関数を作ったので これを生かした方法を考えましょう。
などの対策が考えられます。ほかにもいろいろ対策はあるでしょう。 まずは、(1)の対策を講じてみましょう。これは簡単ですね。 それと、int型の数値をint型の数値でわり算すると 必ずしもint型にならないですね。(1)宣言しただけの変数nedanをkeisanに渡したのがいけない。 これを渡さず、関数の戻り値として計算結果をもらう。 (2)nedanのアドレスをkeisanに渡す (3)nedanをどこからでも見えるようにしておく。(グローバル変数)
という規則があります。 従って、(1)A = B; の時Bがどのような型であってもAの型に変換される (2)二項演算子(+−*/など)で2つの型が異なるとき、 より大きな型に合わせられる char < int < long < float < double
左のプログラムを実際に動かしてみましょう。 金額に0を入力するまで繰り返します。
「%-6.0f」という書き方を覚えましょう。
今度は、きちんと動作しますね。消費税が5%になると
2000円のものが、2100円になるんですね・・・・・
では、次の方法(nedanのアドレスをkeisanに渡す)
で、プログラムを書き直してみましょう。
前のプログラムとの違いがわかりますか? 今度のプログラムでは、keisan()の戻り値は 利用していません。一応、keisan関数は、0を 返していますが、何を返しても関係ありません。 void型にしてしまっても問題ありません。
「&」や「*」の使い方に気をつけてください。
実行結果は、上のものと全く同じです。
では、最後の方法nedanをグローバル変数にしてしまいましょう。
グローバル変数とは、どこからでも見ることのできる
変数です。詳しくは、あとから「変数のスコープ」という章
で説明します。
3つのプログラムを比較してみてください。
同じことをプログラムするにも、いろいろな方法が
あるものです。
Update Nov/11/1996 By Y.Kumei