第2章28 自作関数で引数とプロトタイプ宣言を使う@イチからゲーム作りで覚えるC言語

高い方の値を取得する自作関数の使用

高い方の値を取得する自作関数の使用

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章29 プリコンパイラ処理を知る
NEXT : 2章29 プリコンパイラ処理を知る
2章27 自作関数を作りときプロトタイプ宣言を利用する : PREV

この記事でやること

前回までシンプルで引数のない関数の自作方法と、プロトタイプ宣言を利用する方法についてお話しました。

今回は、新しくプロジェクト「0230_myfunc_with_params」を作り、引数付の関数を自作する方法についてお話します。関数に引数を付けることで、自分で作ることのできる関数の機能の幅がぐっと広がるかと思います。

この記事はゆる~くC言語でコンソールゲームを作りながらプログラミングを学ぶための連載記事です。シリーズものですので記事の一覧はこちらを参照してくださいね。

引数つきの自作の関数を作り、利用するプログラム

引数をもった自作の関数を作り、利用するプログラムを動かして結果を見てみましょう。プロジェクト「0230_myfunc_with_params」を新しく作成し、ソースコード「MyFuncWithParams.c」を作成してみてください。

#include <stdio.h>
int maxValue(int, int);

int main() {
 int akaiKusuri = -5;
 int aoiKusuri = 15;
 printf("マメ犬族の商人:赤い薬と青の薬、どっちを買う?\n");
 printf("ぷらんく:ちょっと試飲させてー。\n");
 printf("赤い薬を飲んで ぷらんく は体力が %d 変化した。\n", akaiKusuri);
 printf("青い薬を飲んで ぷらんく は体力が %d 変化した。\n", aoiKusuri);
 printf("ぷらんく:体力が %d 回復したほう買います。げふぅ。\n"
              , maxValue( akaiKusuri, aoiKusuri ));
 printf("マメ犬族の商人:2つぶんお金はらえよ。\n");
}

// 引数のうち、大きいものを返す関数
int maxValue(int a, int b) {
 if (a > b) {
   return a;
 }
 return b;
}

このコードを実行してみるとこんな結果になったかと思います。

マメ犬族の商人:赤い薬と青の薬、どっちを買う?
ぷらんく:ちょっと試飲させてー。
赤い薬を飲んで ぷらんく は体力が -5 変化した。
青い薬を飲んで ぷらんく は体力が 15 変化した。
ぷらんく:体力が 15 回復したほう買います。げふぅ。
マメ犬族の商人:2つぶんお金はらえよ。

ぷらんくは両方の薬をのんで、回復量が多かったほう(とういかダメージを受けなかったほう)の薬を買うことをきめました。二つの整数のうち、大きい数値を返す関数 maxValue を自作しています。

引数付きの関数を定義

引数付の関数をプロトタイプ宣言するときも以下のルールの通りです。

戻り値の型  関数名 ( 引数1の型 引数1の変数名, 引数2の型 引数2の変数名, … 略 … );

プロトタイプ宣言では、引数の変数名は省略可能とお話したかと思います。
その場合 「void myFunc(int, char, double);」などのように定義することができます。

ソースコードを追ってみよう

今回のソースコードを確認してみましょう。

引数つき関数のプロトタイプ宣言

int maxValue(int, int);

2行目で、int型を返す maxValue 関数をプロトタイプ宣言しています。
第1引数、第2引数には共に int 型を設定する関数と宣言しています。
今回は引数名を省略しています。下のように変数名を入れても大丈夫です。

 int maxValue(int hikisuu1, int hikisuu2); 

main関数の定義

今回の main 関数の中身を見てみましょう。
4行目~14行目が main 関数の中身です。

int main() {
 int akaiKusuri = -5;
 int aoiKusuri = 15;
 printf("マメ犬族の商人:赤い薬と青の薬、どっちを買う?\n");
 printf("ぷらんく:ちょっと試飲させてー。\n");
 printf("赤い薬を飲んで ぷらんく は体力が %d 変化した。\n", akaiKusuri);
 printf("青い薬を飲んで ぷらんく は体力が %d 変化した。\n", aoiKusuri);
 printf("ぷらんく:体力が %d 回復したほう買います。げふぅ。\n"
            , maxValue( akaiKusuri, aoiKusuri ));
 printf("マメ犬族の商人:2つぶんお金はらえよ。\n");
}

新しいことはあまりしていません。
5、6行目で変数 akaiKusuri と aoiKusuri を宣言&初期化しています。

11、12行目は一つの printf 関数呼び出しが途中で改行されています。
第2引数には「maxValue( akaiKusuri, aoiKurusi )」が設定されていますね。

ここで自作関数 maxValue にジャンプして、結果の整数を返す処理が動きます。
次に、今回作成された maxValue 関数を見てみましょう。

自作関数 maxValue の定義

maxValue 関数は 17~22行目で定義されています。
2つの整数を比較して、より大きい整数を返す機能をもった関数です。

// 引数のうち、大きいものを返す関数
int maxValue(int a, int b) {
 if (a > b) {
   return a;
 }
 return b;
}

maxValue は整数を2つ受け取ります。
1つ目の引数に入れた整数は、maxValue 関数にジャンプしてきたときに、「int a」に代入されます。
2つ目の引数に入れた整数は、maxValue 関数にジャンプしてきたときに、「int b」に代入されます。

今回 main関数から「maxValue( akaiKusuri, aoiKusuri )」と呼び出しされており、変数の中身を展開して「maxValue ( -5, 15 ) 」です。
呼び出された側の maxValue の頭では、下のように変数に代入されることになります。

  • int a = -5;
  • int b = 15;

その後の処理を見てみましょう。

// 引数のうち、大きいものを返す関数
int maxValue(int a, int b) {
 if (a > b) {
   return a;
 }
 return b;
}

18~20行はその後はif 文で条件 a > b が真(正しい)ときだけ、実行されます。
19行目で 「return a;」となっており、return 文に到達した時点で、関数の処理は終了し、呼び出し元に対して戻り値である変数 a の中身を返します。
もし、 a > b が偽(正しくない)だった場合、if 文の中身である 19~20行目はスルーして、21行目にジャンプします。21行目では「return b;」となっており、変数「b」の中身を呼び出し元に返します。

ここで注意ですが、戻り値で返すのは変数 a ではなく、a の中身の整数です。
main関数の中で a という変数は使えません

また、関数が呼び出されるときに、関数の中で宣言している int a や int b などの変数は毎回初期化されます

あとがき

今回は簡単な引数つきの関数を作成しました。C言語の標準機能で今回作ったような maxValue 関数のような機能をもつ関数は用意されていたりします。
ですが、自分で作って理解してみることでかゆいところに手が届くようなプログラムを書くことができるかと思います。ぜひいろいろな自作関数を作ってみて下さい。

また、ポインタという機能を使った関数を使えるようになると、さらに高機能な関数を作り上げることができるようになります。ポインタの説明についてしたあとに、関数でポインタを使った例をあらためてお話したいと思います。

今回はここまで。おつかれさまでした。

イチからゲーム作りで覚えるC言語
連載ページ一覧へ
2章29 プリコンパイラ処理を知る
NEXT : 2章29 プリコンパイラ処理を知る
2章27 自作関数を作りときプロトタイプ宣言を利用する : PREV

非常に参考になったサイトさまや、参考文献など

ページの更新履歴

更新日更新内容
更新なし