はじめに
このページと次のページでC言語でよくつかわれる制御文について説明します。制御文と条件文については前のページを参照願います。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。
※以下の情報は2007年11月現在のものです。ご注意ください。
※このページではC言語の用語が沢山出てきますが、ビギナーの方は各自C言語の初級本なども参照しながら読み進めてください。
制御 while
xxの間は処理を繰り返す、という場合はwhile(ホワイル)を使います。for文でも同じ制御はできますが、whileを使った方が記述がシンプルになる場合が多くあります。記述がシンプルになるということはエラーを防ぐ意味でも大変重要です。
whileの構文は次のようになります。
while ( 条件文) { ...}
条件文がtrueの間は{ }内の処理を繰り返します。
int a;
a = 0;
while (a > 3) {
a++;
処理A;
}
この場合はwhileの条件()の中がtrueの間は処理Aが繰り返されます。この例では処理Aは3回実行されます。この例ではfor文と使い方はかわりませんが、マイコンの場合は特殊レジスタの状態を監視したり、状態が変化するまである処理をつづける、ということがよくありますので、そのような場合にも多く使われます。
例えば、RB12端子、つまりポートBの12番端子を入力に設定しており、その端子がLOWの間は待つ(HIGHになるまで待つ)というプログラムは次のようになります。
while(PORTBbits.RB12 == 0){
}
この場合、RB12がLOW(0)の場合は{ }内が処理されますが、{ }内には何も書いていないので何も起きない、つまりRB=0の場合はなにもしないで待つ、つまりRB12が1になるまで待つ、というプログラムになります。{ }内に何もない場合は省略して、
while(PORTBbits.RB12 == 0);
のようにも書けます。PORTBbits.RB12はRB12端子の入力状態を表すもので、0か1の値になります。0Vの時に0、3.3Vの時に1になります。詳しくは機能編で説明します。
条件文のカッコはtrueかどうかを判定しています。 論理演算の説明のページでも書きましたが、コンピュータ内では実際にはtrueかfalseかというのは判断できないので1をture、それ以外をfalseと決めています。1ビットデータの場合はtrueが1、falseが0となります。int型変数の場合は16ビットですが、trueが1、falseは1以外の数になります。
whileで、条件文の部分を単に 1 と入れると「常にtrue」という結果となりますので{ }内が永遠に繰り返されることになります。
while(1){
処理1;
処理2;
...
}
この場合は処理1、処理2...が永遠に繰り返されます。PCのプログラムの場合はこのようなパターンはあまりありませんが、マイコンシステムの場合、電源が入っている間はずっと動き続ける、というのが普通なので、main関数の中での実際の処理は
while(1) でずっとループ(同じことを実行すること)させるのが普通です。
制御 break
whileや、前のページのfor文はループ文と呼ばれます。ループとは繰り返すという意味です。ループ文の中で、ある条件になったらループを抜けたいという場合に
break を使います。例えば
while(1){
if (PORTBbits.RB12 == 0) break;
処理A;
}
この場合は、基本的には処理Aをずっと繰り返しますが、RB12がLOWになったらループを抜けます。
制御 switch
if文とelseを使うと条件の分岐ができますが、条件が多い場合にはswitch文を使うと記述が簡単になります。構文は次の通りになります。
switch (変数名) {
case 定数1:
処理1−1;
処理1−2
...
break;
case 定数2:
処理2−1;
処理2−2
...
break;
case 定数3:
処理3−1;
処理3−2
...
break;
・
・
・
}
構文が少し複雑なので注意して下さい。 switch後の( )内の変数の値が定数1〜3...に該当する場合は、それぞれのcaseの次の行からbreakの行までを実行します。
たとえば変数の値が定数1と同じだった場合は処理1−1...が実行され、breakのところでswitch文を抜けます。
ここでポイントですが、マイコンのC言語の場合、定数には10進数の整数しか使えない場合が多く、C30の場合もそうです。たとえば、
case 1: と書けますが、 case 0x01: と書くとエラーもしくは無視される場合がありますので注意して下さい。小数点の値も使えません。
case の後の定数の後は:です。;ではありません。(間違いやすいので注意。)
また、break; のところをよく書き忘れますので注意しましょう。breakを抜いてもコンパイル時にエラーになるケースは少ないのですが、実行するとそれ以下の処理も実行されてしまいます。(意図的にそのように書く場合もある)
例)
int a;
a = 2;
switch(a){
case 1:
処理1;
break;
case 2:
処理2;
break;
case 3:
処理3;
break;
}
この場合は処理2が実行されます。
C言語ではこれらの他にいくつかの制御文がありますが、ここまでで挙げた5つでほとんどのプログラムは書けると思います。興味のある方はC言語の本で勉強してみてください。
では実際に制御文を使った実験をしてみましょう。
準備
<接続>
A33Fの電源を入れるため、USBケーブルをPCへつないで下さい。
A33Fにプログラムを転送するので、ICD2経由でPCへつないで下さい。
<COMポートの確認、ハイパーターミナルの起動>
前のページのようにCOM番号を確認して、ハイパーターミナルを起動して設定してください。
<プロジェクトの作成>
今回も、プログラムは前回作ったソースプログラムを流用してみます。今度は、前回作ったArithmetic.cの環境をそのまま開いてみましょう。
Project->Open を選択します。
「ファイルの場所」で、前回作ったフォルダを指定すると、プロジェクト名に.mcpが付いているファイルがありますのでそれを指定して「開く」を押しますと、前回のプロジェクトが開かれます。
前と同じ状態でMPLABの環境が設定されています。
プログラムの変更
では、ソースプログラムを下のように書き換えてください。
プログラム部分は半角にすることを忘れないで下さい。
変更点は行80と行101〜116の部分です。
行103のように、以前から、計算部分や結果表示の部分を while(1) { } で囲んでいました。これはその中の処理をずっと続けるということです。
行101で変数aには2が代入されています。switch文でこれを判定すると、case 2: の部分が実行されます。
結果は次のようになりました。
おわりに
次はC言語の配列について説明します。
2007年11月30日
|