<C言語入門/車載ソフト> 配列
こんにちは、レオハルです。
車載ソフトで利用するC言語入門シリーズ「for文」です。
※通常のC言語解説とは、異なり組込み・車載ソフトに特化した記載があります。ご注意ください。
配列とは
配列とは、同じ型のデータを連続した領域のメモリに配置するオブジェクトの集合体のことです。複数のデータをまとめて管理することができるため、バラバラの変数として扱うよりも便利に使えるケースがあります。
配列の定義方法
配列は次のように記述し、定義します。
型 配列名[要素数];
s2(int)型で要素数が10の配列を使いたい場合には、次のように記述します。
s2 s2g_data[10];
これで、2byte×10個分のメモリ領域が確保され、それぞれの領域にs2型のデータを配置できるようになります。
配列の初期化
配列を宣言する際に各領域にデータを初期値として設定しておくことが可能です。
複数の定数をひと固まりに管理し、宣言するような場合には、次のように記述することができます。
const u2 U2G_CNST_ZYOSU[ 5 ] = { 10, 20, 30, 40, 50 }
U2G_CNST_ZYOSUという名前の配列のそれぞれの要素に10~50の5つの値を設定することができます。
配列の参照・代入方法
配列の各要素にアクセスする場合には、添え字(そえじ)と呼ばれる数値で指定します。
[ ]の間に数値を記述します。
配列を定義する際の要素数は、『何個の箱を作るか』です。
しかし、各配列の要素にアクセスする場合は、『配列の先頭から+いくつ先の箱か』を
指定するものになり、0 ~ N-1になります。先ほどのU2G_CNST_ZYOSUという配列を例にすると、添え字として指定できるのは、0~4になります。
s2g_data[1] = u2g_cnst_ZYOSU[2]
配列外アクセスには注意
ちなみによくある失敗として、添え字に配列要素数以上の数値をしていしまう配列外アクセスです。要素数が10として定義されているs2g_data[]にうっかり、s2g_data[10]としてアクセスしていまったというケースです。
この場合、通常マイコンであれば、配列の先頭アドレスから10個先にあるデータにアクセスしていまい、本来そのアドレスに入っている変数のデータを破壊していまいます。
2次元配列・多次元配列
配列は、要素数を二重以上に重ねて記載することができ、2次元やそれ以上の多次元の配列を定義することが可能です。2次元配列の定数を初期化する例に挙げてみます。
u2 u2g_cnst_2DZYOSU[3][ 5 ] = { { 10, 20, 30, 40, 50 }, { 11, 12, 31, 41, 51 }, { 12, 22, 32, 42, 52 }}
この例で、u2g_cnst_2DZYOSU[2][3]を指定した場合、値としては、「42」が格納されています。
使い方
車載ソフトで配列がどのように使えるか考えてみましょう。
車には、4つタイヤがついています。それぞれに車輪速センサがついています。
車輪速センサの値を利用する場合、電気的なノイズや、ロードノイズ等でセンサ値は細かく振動しています。この細かい振動を除去するための処理(フィルタ処理)を4輪全部に実施するとします。こういった場合に配列を使ったプログラムを利用し、次のように記述します。
u2 u2g_input_vx[4]; /* 入力 */ u2 u2g_after_filter_vx[4]; /* フィルタ後値 */ /* フィルター関数 の宣言 */ u2 u2g_func_Butterworth( u2 input ) ;
void vog_filter_vx( void ){ u1 u1a_crnt_whl ; for( u1a_crnt_whl = 0; u1a_crnt_whl < 4 ; u1a_crnt_whl ++){ u2g_after_filter_vx[u1a_crnt_whl ] = u2g_func_Butterworth( u2g_input_vx[u1a_crnt_whl ]; } }
このように記述することで同じ処理を繰り返し記述しなくても、ループで配列を処理することができ、記述量を減らすことが可能です。
4つくらいならすべてを並べて書いてもいけそうですが、これが、10個、50個、100個とあるデータに対しての処理だった場合どうでしょうか?
いくらコピペで対応できたとしても、どこかでミスが発生しそうです。
C言語学習におススメの書籍
【C言語/プログラミング初心者の方】
【入門卒業レベルの方】
【組込み向け】