こんちゃっす、ダイブツです。
今回はC言語の関数という内容について学習していきましょう。
あなたは今までのC言語学習で、「あー、また似たような処理書かなくちゃいけない…。めんどくさいな~」と感じたことはありませんか?
今回学ぶ関数は、そんな不満を解消する為に使う機能です。
この記事では、
・関数の宣言、呼び出し方
・関数に引数、戻り値を設定する方法
・関数を使うタイミング
について説明していきますね。
特に「関数を使うタイミング」については、僕が8年間組み込みエンジニアとして働いてきたからこそ伝えられる内容です。
この内容だけでも、あなたは一流のプログラマーに一歩近づくことができますよ。
目次
関数、引数、戻り値とは?
関数とは
まず、関数とは何か説明していきます。
関数という名前だけ見ると、変数の一種かな?と思うかもしれませんが、全くの別物です。
関数とは、ある一連のまとまった処理を行うプログラムのことです。
例えば、あなたが朝起きる時のことを想像してください。
「起きる」といっても細かく言えば色んな行動をしますよね?
僕だったら
・目覚ましを止める。
・布団から出る。
・カーテンを開ける。
の3つのことをします。
関数は、上で言う「起きる」と表現している言葉のことです。
関数は色んな行動を行なうことをまとめて1つで表しているんですね。
なので、プログラムでも同じようにいくつかのまとまった処理を1つの括りとして関数としているんです。
関数を使うことによって、全体のプログラム量を1/2、1/3…と減らしていくことができます。
引数とは
その関数に対して、引数とは、「起きる」動作に対して追加で情報を与える値のことです。
例えば、「朝6時」という引数を渡して「起きる」という関数を呼び出すと、「朝6時に起きる」動作になる、といったイメージです。
戻り値とは
情報を与える引数に対し、戻り値は「起きる」動作をした結果の値のことです
例えば、「起きる」という関数を呼び出したのに、「起きることが出来なかった」という結果を受け取るイメージです。
今すぐ使える!3つの関数宣言例
関数の書き方はパターンさえ覚えちゃえば簡単です。
これさえ覚えておけばいいという関数の例を3つ出すので、まずはこの3パターンを使えるようになりましょう。
関数例1:引数、戻り値が無い場合
void test_function(void); // 関数宣言
void test_function(void){
関数の処理
return;
}
関数例2:int型の引数が2つ、戻り値が無い場合
void test_function(int iHikisu1, int iHikisu2); // 関数宣言
void test_function(int iHikisu1, int iHikisu2){
関数の処理
return;
}
関数例3:int型の引数が2つ、int型の戻り値が有る場合
int test_function(int iHikisu1, int iHikisu2); // 関数宣言
int test_function(int iHikisu1, int iHikisu2){
関数の処理
return iModoriti;
}
関数宣言と書いてある部分は、基本的にファイルの上の方に書きます。
また、戻り値が無い場合は、returnを省略することもできます。
そして、関数の宣言で使う型は、変数の宣言時に使う型と同じです。
ただ、関数の宣言では、変数宣言にはあまり使わないvoidという型をよく使います。
このvoidは、「型が何も無いよ」ということを表しているんですね。
戻り値が何も無い時に、宣言する型が無いからvoidを書く、というルールになっていますよ。
また、1つの関数に対して、引数は複数設定できるんですが、戻り値は1つしか設定できません。
複数の戻り値を返したい場合は、ポインタというものを使う必要があります。
ポインタについてはまた今後説明するので一旦説明は飛ばしますね。
あと、上の関数名でも書いていますが、関数のことはよくfunctionと呼ばれることがあります。
人によって関数と言ったりfunctionと言ったりややこしいんですが、よく出てくる言葉なので覚えておきましょう。
実例を使って紹介!関数の呼び出し方法って?
それじゃあ実際に関数を宣言して呼び出すプログラム例を紹介します。
まず、以下のように関数を使わないでLEDを点灯か消灯させるプログラムを元にしていきます。
#include "r_cg_userdefine.h"
void main_study(void)
{
int iLedOnOff = 1; //LEDの点灯消灯設定用変数(0:消灯、1:点灯)
char cSelectLed = 1; //点灯させるLEDを選択(1:緑色、2:青色、3:赤色)
switch(cSelectLed){
case 1:
P_GREEN_LED = iLedOnOff; // 緑色LEDを点灯 or 消灯
break;
case 2:
P_BLUE_LED = iLedOnOff; // 青色LEDを点灯 or 消灯
break;
case 3:
P_RED_LED = iLedOnOff; // 赤色LEDを点灯 or 消灯
break;
default:
P_GREEN_LED = iLedOnOff; // 1~3以外が指定された時の念のため処理
break;
}
}
このプログラムからled_on_offという関数を作ると・・・
こうなります!
#include "r_cg_userdefine.h"
void led_on_off(char cSelectLed, int iLedOnOff); //LEDを点灯、消灯させる関数宣言
void main_study(void)
{
int iLedOnOff = 1; //LEDの点灯消灯設定用変数(0:消灯、1:点灯)
char cSelectLed = 1; //点灯させるLEDを選択(1:緑色、2:青色、3:赤色)
led_on_off(cSelectLed, iLedOnOff); // LEDの点灯、消灯処理
}
void led_on_off(char cSelectLed, int iLedOnOff)
{
switch(cSelectLed){
case 1:
P_GREEN_LED = iLedOnOff; // 緑色LEDを点灯 or 消灯
break;
case 2:
P_BLUE_LED = iLedOnOff; // 青色LEDを点灯 or 消灯
break;
case 3:
P_RED_LED = iLedOnOff; // 赤色LEDを点灯 or 消灯
break;
default:
P_GREEN_LED = iLedOnOff; // 1~3以外が指定された時の念のため処理
break;
}
return;
}
main_study関数の内容がスッキリして読みやすくなりましたよね?
このように、ある程度まとまった処理を整理して使うのが関数です。
もちろん、この関数は他の箇所から呼ぶ、っていう使い回しもできますよ!
どんな時に関数を使えばいいの?
ただ初めのうちは、どんな時に関数を使えばいいか分からないと思います。
なので、プログラマー歴8年の僕がどんな時に関数を作るかポイントを2つ書き出しました。
今までの経験上、これらのポイントさえ押さえておけば間違いないですよ!
「関数を作る基準」
1、色んな箇所で同じ処理を使用する時
2、プログラムを整理して、読みやすくしたい時
1の内容は最初に書いていた、プログラム全体の量を減らすということですね。
同じ処理を使うなら関数にしておいて、後から使いまわそうよ、という考えです。
特に複数人でプログラムを作成する時は、他の人が必要になる関数をあらかじめ作っておくと感謝されますよw
関数を作ることが思いやりのようになってるんです。
2の内容は、単純にプログラムを整理して分かりやすくしたいというだけです。
早く関数全ての処理を確認したいのに、1000行も処理が続いているようなプログラムなんてもう・・・全く読む気力が湧きません。
なので、1つの関数には長くても100行に納まるプログラムを意識しておくと、要点がまとまって読みやすいプログラムになりますよ!
関数には引数や戻り値も設定できるので使いやすいですしね~。
まとめ
C言語だけに限った話ではないですが、プログラミングでは関数は切っても切れないものです。
単純に言えば、「関数=プログラムの置き換え」と考えれば問題ありません。
関数は絶対必要になる機能なので、何も見なくても自分で書けるレベルを目指しましょう!
気軽にコメントどうぞ!