2010年7月16日金曜日

組込みC言語(C言語について)

今回の投稿は、組込み現場のCプログラミングの本について話したいと思います。

C言語が、なぜ組込み現場で使われているかについては割愛させていただきます。

今回の内容は、C言語の一般的特徴や、良いコードの書き方について紹介していきたいと思います。

1.高級言語である。
2.高級言語でありながら、低レベルな処理まで記述できる言語
3.C言語=高級アセンブリ言語
4.さまざまなマイコンのプログラムを書く事ができる。(しかし、組込み系においてはハードウェアを知っておく事は非常に重要である。)
5.高級言語であるために曖昧さを含んでいる。

以上の5つが本に紹介されていた主なC言語の特徴です。

5で紹介されている。C言語の問題点である曖昧さについて、よくある間違いや、ミスをなくす方法。

<<フリーフォーマットの改善>>
C言語において、連続した空行や改行は、文字列データ以外では意味を持たないため、プログラマーが自由に作成が可能である。
例1.1
if(value==1){
value=2;
}

例1.2
if(value==1)
{value=2;}

例1.3
if(value==1){value=2;}

以上3つの例は、機械語に翻訳された際には、全く同じ機械語が生成されます。
これは、バラバラに書いた場合非常に可読性や保守性の悪いプログラムができてしまいます。
インデントや空白が大事である例を以下に示します。
例1.4
///////////////////////////////////////////////////////////
#include

int main(void){
int i;

printf("input i=");
scanf("%d",&i);
if(i==0){
printf("i=0\n");
}
else
{
if(i>0){
printf("i>0\n");
}else{
printf("i<0\n");
}
}
return 0;
}
////////////////////////////////////////////////////////////

例1.5
////////////////////////////////////////////////////////////
#include
int main(void){int i;
printf("input i=");
scanf("%d",&i);
if(i==0){printf("i=0\n");}
else{
if(i>0){printf("i>0\n");}
else{printf("i<0\n");}}
return 0;}
////////////////////////////////////////////////////////////

例1.4と1.5は全く同じ機械語が出力されます。
しかし、人にとってみれば例1.4ではifの分岐がはっきりわかりますが、
(追記 例1.4についてですが、空白が自動的につめられているようです。)
例1.5では、しっかり読んで意味をとらえなければ何をしているかがわかりません。
なので空白やインデントは非常に重要になってきます。


また、タイピングミスなどによってコンパイラには引っかからないが、意図したものとは違う結果をもたらす。
例2.1 if(a==b){ //aとbの値が同値の時
  //処理1
}
例2.2
if(a=b){ //aにbを代入する。
//処理1
}
以上のように例2.2ではifの意味が全くなくなってしまっている。しかし、コンパイラには問題なく通ってしまいます。

<<フリーフォマットの教訓>>

C言語では、書き方が自由にできるので、統一する事。統一の方法についてはSESSAMEコーディング規約他
また、コンパイラは文法的な間違いは指摘してくれるが、意味は考えてくれない。


参考文献
組み込み現場のCプログラミング基礎から分かる徹底入門 2007年
片岡 巌著 技術評論社

0 件のコメント:

コメントを投稿