関数の呼び出し

これまでの文章で解ってもらえているとは思いますが、関数は複数作れます。
その例を下に示します。

#include <stdio.h>

int main(int argc,char **argv){
  printf("これはmain関数の処理です\n");
  return 0;
}

void MyFunction(void){
  printf("これはMyFunction関数の処理です\n");
}


----------
実行結果
----------
これはmain関数の処理です

実行結果から分かるように、main関数しか実行されません。
原因はMyFunction関数が呼ばれていないことにあります。

main関数はプログラムを実行した時に、最初に呼ばれますが、
他の関数は明示的に呼び出さない限り、勝手に実行されることはありません。
それではmain関数からMyFunction関数を呼び出す例を示します。

#include <stdio.h>

int main(int argc,char **argv){
  printf("これはmain関数の処理です\n");
  MyFunction();
  return 0;
}

void MyFunction(void){
  printf("これはMyFunction関数の処理です\n");
}

関数は 関数名(引数); とすれば、呼び出すことができます(引数はなければ空にする)
が、上のソースをコンパイルするとエラーが発生します。
そのエラーの内容はMyFunction関数が見つからないというものです。

明らかにMyFunction関数を定義しているのに、このエラーが発生する原因は、
MyFunction関数がmain関数よりも下で定義されているということにあります。
コンパイルは上から順に行われるので、main関数をコンパイルしている段階では、
MyFunction関数はまだ定義されていないというわけですね。

これの解決策は二つあります。
1つは多くの人が思い付いたのではないでしょうか?
MyFunction関数をmain関数よりも上で定義するという方法です。
では、その例を下に示します。

#include <stdio.h>

void MyFunction(void){
  printf("これはMyFunction関数の処理です\n");
}

int main(int argc,char **argv){
  printf("これはmain関数の処理です\n");
  MyFunction();
  return 0;
}


----------
実行結果
----------
これはmain関数の処理です
これはMyFunction関数の処理です

一応これで、コンパイルは正常に完了します。
それでは次にプログラムの流れを示します。

1)OSからmain関数が呼ばれ、main関数の最初の文が実行される
 >printf("これはmain関数の処理です\n"); が実行
 >printf関数が呼び出される

2)printf関数が終わり、main関数に復帰する

3)main関数の次の文が実行される
 >MyFunction(); が実行
 >MyFunction関数が呼び出される

4)MyFunction関数の最初の文が実行される
 >printf("これはMyFunction関数の処理です\n"); が実行
 >printf関数が呼び出される

5)printf関数が終わり、MyFunction関数に復帰する

6)MyFunction関数が終わり、main関数に復帰する

7)main関数の次の文が実行される
 >return 0; が実行

8)main関数が終わりOSに復帰する

「いまさら」って感もありますが、 printf("表示させたい文字"); とは、
printf関数の呼び出しだったのです。
関数はprintf関数のようにもともと準備されているものもあります。
このような関数を「ライブラリ関数」といいます。
ちなみに "表示させたい文字" は、引数となっています。

もう、忘れたかもしれませんが、もう1つの解決策は後にします。
まあ、そのころには、忘れていてもかまいませんが。