第5講 関数(1)
第3話 2人の社員がお互いに仕事を依頼し合うとどうなる?
#include<stdio.h> //prinf()を使えるようにするためにインクルード
void f(); //社員f()を採用
void g(); //社員g()を採用
int main() {
f(); //社員f()に仕事を命じている
}
void f(){
printf("こんにちは!\n");
g(); //社員g()に仕事をお願いしている
}
void g(){
printf("今日は良い天気ですね。\n");
f(); //社員f()に仕事をお願いしている
}
とすると、
が続いた後、
とエラーしてしまいます。
このようなときはプログラムの終了を押して下さい。
途中でエラーしてしまった原因は、
このプログラムだと無限ループになってしまうからです。
私の実験によると、
仕事の依頼は4700回程度(正確には覚えていません。)が上限なのです。
その上限回数をこのプログラムだとあっという間に超えてしまします。
なぜ無限ループになってしまうのかと申しますと、
ちょうど鏡を平行に置くと無限に鏡が映し出されるのと同じ状態だからです。
f()→g()→f()→g()→f()→g()→・・・
ですね。仕事の依頼が無限に連鎖してしまいます。
無限ループは、プログラミングにおいては宿痾です。
ただし、すでにアプリやソフトと名付けたプログラムにおいては、
意図的に無限ループを利用していますし、
ゲームプログラミングは基本的に無限ループを使います。
この例外を除いては、無限ループとの戦いがプログラミングであるといっても、
決して大げさとはいえないほど、
うっかりすると無限ループの罠にはまってしまうことがあるのです。
エラーしないようにするには、
回数をカウントする変数を導入します。
プログラムソースを次のように変更して下さい。
#include<stdio.h> //prinf()を使えるようにするためにインクルード
void f(int k); //社員f()を採用
void g(int k); //社員g()を採用
int main() {
f(0); //社員f()に仕事を命じている
}
void f(int k){
k++;
printf("こんにちは!\n");
g(k); //社員g()に仕事をお願いしている
}
void g(int k){
printf("今日は良い天気ですね。\n");
if(k<5)f(k); //社員f()に仕事をお願いしている
}
実行画面
こんにちは!
今日は良い天気ですね。
こんにちは!
今日は良い天気ですね。
こんにちは!
今日は良い天気ですね。
こんにちは!
今日は良い天気ですね。
こんにちは!
今日は良い天気ですね。
ちょうど5回表示してプログラムが終わりました。