Nodachisoft Nodachi Sword Icon
  
@あまじ✎ 2018年8月9日に更新

第2章28 自作関数で引数とプロトタイプ宣言を使う

イチからゲーム作りで覚えるC言語
第2章27 自作関数を作りときプロトタイプ宣言を利用する : PREV
NEXT : 第2章29 プリコンパイラ処理とインクルード文@イチからゲーム作りで覚えるC言語 :

この記事でやること

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

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

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

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

 
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;
}

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

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

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

引数付きの関数を定義

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

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

プロトタイプ宣言では、引数の変数名は省略可能とお話したかと思います。

その場合 「void myFunc(int, char, double);」などのように定義することができます。

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

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

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

 
MyFuncWithParams.c
int maxValue(int, int);

2行目で、int型を返す maxValue 関数をプロトタイプ宣言しています。

第1引数、第2引数には共に int 型を設定する関数と宣言しています。

今回は引数名を省略しています。下のように変数名を入れても大丈夫です。

 
MyFuncWithParams.c
 int maxValue(int hikisuu1, int hikisuu2); 

main関数の定義

今回の main 関数の中身を見てみましょう。

4行目~14行目が main 関数の中身です。

 
MyFuncWithParams.c
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つの整数を比較して、より大きい整数を返す機能をもった関数です。

 
MyFuncWithParams.c
// 引数のうち、大きいものを返す関数
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;

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

 
MyFuncWithParams.c
// 引数のうち、大きいものを返す関数
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 関数のような機能をもつ関数は用意されていたりします。

ですが、自分で作って理解してみることでかゆいところに手が届くようなプログラムを書くことができるかと思います。ぜひいろいろな自作関数を作ってみて下さい。

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

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

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

ページの更新履歴

更新日 更新内容
更新なし

コメント

匿名 2019年6月23日 5:52 AM

わかりやすくて参考になりました。

あまじ 2016年10月31日 10:00 PM

>> sorimeさま
コメント頂きありがとうございます!
未熟者なりに調べてはいるつもりですが、
誤った情報もあるかと思いますので、ご参考程度にでもお役立ちいただければと思います。

F.T 2019年9月11日 10:05 PM

どのサイトより理解しやすいです。2章29が待ち通しいです。

あまじ 2019年9月15日 12:57 PM

記事かいている、あまじです。読んでいただいて、しかもコメントも頂きありがとうございます。大変お待たせしてしまって申し訳ありません。
理解しやすいと書いてくださって、とてもうれしいです!
近々執筆再開しようと思います。
もうしばしお待ちいただければと思います・・!

イチからゲーム作りで覚えるC言語
第2章27 自作関数を作りときプロトタイプ宣言を利用する : PREV
NEXT : 第2章29 プリコンパイラ処理とインクルード文@イチからゲーム作りで覚えるC言語 :
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

ゲーム等で使えるつなぎ目のないループするテクスチャ画像の作り方

#ツール#ゲームプログラミング✎ 2021-01-24
ゲームなどで使えるループ画像、パターンテクスチャのツール、手動での作り方をまとめ
広告領域
追従 広告領域
目次
第2章28 自作関数で引数とプロトタイプ宣言を使う
第2章28 自作関数で引数とプロトタイプ宣言を使う
この記事でやること
この記事でやること
引数つきの自作の関数を作り、利用するプログラム
引数つきの自作の関数を作り、利用するプログラム
引数付きの関数を定義
引数付きの関数を定義
ソースコードを追ってみよう
ソースコードを追ってみよう
引数つき関数のプロトタイプ宣言
引数つき関数のプロトタイプ宣言
main関数の定義
main関数の定義
自作関数 maxValue の定義
自作関数 maxValue の定義
あとがき
あとがき
非常に参考になったサイトさまや、参考文献など
非常に参考になったサイトさまや、参考文献など
ページの更新履歴
ページの更新履歴
コメント
コメント
Nodachisoft © 2020