電子工作入門プログラミング入門-基礎1今回は関数を変更してみます。やりたいこと前回の記事で、残り時間を表現する3個のLEDを制御する関数を作りました。LOW);というように、1つの命令で3個のLEDを制御できる関数を作りました。この関数についてもう少し深く考えてみます。この関数は、1つの命令で、3個のLEDを使って残り時間を表現することが目的です。確かに1つの命令で3個のLEDを制御できれば便利ですが、パラメータが3つあり、緑LED、黄LED、赤LEDを制御する関数になっています。残り時間を表現するのであれば、パラメータはこのようなものではなくて、残り時間を指定できればもう少し便利になりそうです。パラメータに残り時間の目安を表す数字として以下のように関数を呼び出すことができればもっと便利になるのではないか、という考え方です。controlTimeLed(1);つまり、controlTimeLed関数のパラメータを残り時間に応じて、3、2、1というように指定して、その残り時間に合わせて3個のLEDを制御できればいいのではないか、という考え方です。いうことで、今回はこのような制御ができるように関数の仕様を変更したいと思います。関数の変更方針これから関数を変更しますが、変更後の関数のパラメータはuint8_t型の「nokori_jikan」という変数にします。いうことは、関数の定義は以下のように変更すればよいことになります。・もしnokori_jikanが1だったら、緑OFF、黄OFF、赤ONにする}この関数の中身は今まで習得した知識で書くことができますよね。具体的にはif文を使えば実現できます。実際にif文で以下のように関数を定義すればOKそうです。}}実際にこのように書けばきちんと動作するのですが、C/C++言語では別の書き方ができるようになっています。今回の記事ではその書き方を習得します。「nokori_jikanという変数の値が3のとき、2のとき、1のときでそれぞれ別の処理をする」ということですよね。このように変数の値に応じて場合分けをして処理をしたい場合、C/C++言語では「switch文」という構文が用意されています。最初にswitch文の書き方を確認しましょう。最初に言葉の意味を確認しておきます。「switch」は日本語でも「スイッチ」と言っていますが、「切り替える」という意味です。「case」は「〜の場合」という意味です。「default」は日本語でも「デフォルト」と言っていることが多いですが、「通常」というような意味ですが、switch文では「その他」というような意味になります。「break」は「止める」という意味です。いうことで、以下のように日本語で書くとわかりやすいと思います。処理;}なお、「default」に対応する処理がない場合はdefaultの部分は省略することができます。switch文はこのように値に応じて処理を切り替える場合に便利ですが、いくつか注意点があります。気になった方もいるかもしれませんが、それぞれの処理で「break;」(処理終了)という文がありますよね。最後の「default:」では「break;」がありません。この「break;」は、switch文の処理を終わらせる、という意味があります。以下に具体的な例で確認しましょう。switch文を以下のように書いた場合の動作を見てみます。処理;}例えば「式」が「値1」に一致した場合、「処理1」が実行されて、次の行に「break;」がありますので、このswitch文の処理は終わります。それでは以下のように処理1の後にbreakがないときはどうなるのでしょうか。処理;}「式」が「値1」に一致した場合、「処理1」が実行されますが、次に「break;」がないので、「処理2;」も実行されてしまうんです。値2:」がありますが、これは無視されてしまいます。switchは場合分けの処理な訳だから、「break;」なんていらないのではないか、と思いませんか?実は「break;」がないと次の処理がされてしまう、という性質を利用して以下のような書き方ができるんです。処理;}これは「式」が「値1」か「値2」に一致するときに「処理2;」を実行します。言っても、「break;」を書くのを忘れそうですよね。実際にswitch文を書くときこの「break;」を書き忘れて動作がおかしくなることが多々あります。それでは、実際に前回の記事で作成した関数を書き直してみます。変更後の関数はパラメータは「nokori_jikan」(uint8_t型)という変数で、この値が3、2、1で場合分けをして処理をするようにします。switch文では3、2、1で場合分けをして3個のLEDを処理するようにします。1:」の処理は最後ですので、breakを入れても入れなくても動作は変わりません。このような場合でもbreakを入れることをお勧めします。1:」の処理にはbreakが必要になります。このように後からcaseを追加する場合、前に書いたcaseにbreakがない場合にbreakを追加する、ということよく忘れます。これが原因で動作がおかしく気づかずに苦労することがあります。いうことで、caseでは最後にbreakを入れることをお勧めします。スケッチまとめそれでは前回の関数をswitchに変更したスケッチを以下に示します。関数を変更後、関数を呼ぶところも修正することに注意してください。