<C言語入門/車載ソフト> for文
こんにちは、レオハルです。
車載ソフトで利用するC言語入門シリーズ「for文」です。
※通常のC言語解説とは、異なり組込み・車載ソフトに特化した記載があります。ご注意ください。
基本的な使い方
for文は、while文と同様に「反復」実現できるC言語の構文の一つです。
while文は、「条件式が成立するまで処理を繰り返す」ことができました。
for文では、これに加えて、「最初に実行する処理」、「条件再判定前に実行する処理」を構文に組み込んで表現することができます。
for文は、"ある特定の回数"だけ処理を繰り返したい場合に使われます。while文でも同様のことは可能ですが、while文は”ある特定の状態"が継続しいている場合に使うといいと考えています。
基本的な使い方を次に示します。
for( 初期化式 ; 条件式 ; 変化式 ){
実行処理 ;
}
処理が実行される順番ですが、以下のようになります。
①初期化式
②条件式 成立時のみ③以降実施
③実行処理
④変化式
⑤②へ戻る
よくある使われ方
for文の使い方をもう少し理解するために、よくある使われ方として、配列へのアクセス処理を2パターン紹介します。
配列へのアクセス
この例は、u1g_dat_input[ ]の配列に”0”が何回出てくるか調べるプログラムです。
u1 u1g_dat_input[10] = [21,4,53,0,97,11,34,0,22,0] ; u1 u1g_cnt_zero ; void vog_search_Zero( void ) { u1 u1a_i ;
u1g_cnt_zero = 0 ; for( u1a_i = 0 ; u1a_i < 10 ; u1a_i ++ ){ if( 0 == u1g_dat_input[ u1a_i ] ){ u1g_cnt_zero++ ; } else{ /* 処理なし */ } } }
配列の添え字をfor文の初期化式で0にし、変化式でインクリメントし、継続条件式で終了を判定するというやり方がよく利用されます。
多次元配列へのアクセス(多重ループ)
for文の中に、for文を記述することで、多重ループを作り出すことが簡単にできます。
先ほどの配列を2次元配列にして、3×10個の要素を持つ配列から"0"が何回出てくるかを調べるサンプルプログラムを用意しました。
u1 u1g_dat_input[ 3][ 10 ] = { {21,4,53,0,97,11,34,0,22,0 }, {23,48,0,23,87,43,0,11, 93, 3}, {0,34,91,35,67,48, 20,45,66,12} } ; u1 u1g_cnt_zero ; void vog_search_Zero( void ) { u1 u1a_i ; u1 u1a_j ;
u1g_cnt_zero = 0 ; for( u1a_i = 0 ; u1a_i < 3 ; u1a_i ++ ){ for( u1a_j = 0 ; u1a_j < 10 ; u1a_j++ ){ if( 0 == u1g_dat_temp[ u1a_i ][ u1a_j ] ){ u1g_cnt_zero++ ; } else{ /* 処理なし */ } } } }
このように記述することで、多次元配列の各要素にアクセスすることができます。
一つ目のfor文で、[3]の添え字部分を、2つ目のfor文で[10]の添え字部分をループでアクセスしていきます。
for文で使われるループ変数の命名
これは私の意見ですが、
ループ変数に「 i 」とか「 j 」とか、意味のない変数は使わないほうがいいと考えています。上のようなただのサンプルプログラムや、個人で作るレベルのソフトであればいいでしょう。
しかし、チームとして複数人で扱ったり、数年先別の人が見るようなソフトを開発している場合には、意味のある命名をするべきだと思っています。
可読性や保守性が、ループ変数に意味を持たすことで上がり、不具合を減らすことにつながります。「size」とか「type」とか「number」とか簡単な内容を書くだけでも結構変わるとこれまでの経験で感じています。
配列外アクセスに注意!
上記例でfor文内の継続条件式が"u1a_i < 10"になっていました。
これをうっかり、"u1a_i <= 10 "にしてしまった場合、不具合につながります。
u1g_dat_input[ 10 ] の要素数は10ですから、添え字としては、[ 0 ]~[ 9 ]までしかありません。添え字に10を指定すると、本来の配列以外の領域にアクセスしてしまいます。
for文の継続条件式の不等号には、十分注意して設定するようにしましょう。
C言語学習におススメの書籍
【C言語/プログラミング初心者の方】
【入門卒業レベルの方】
【組込み向け】