こんにちは、ダックです。
最近はソフトウェアの研修に励んでいます。
FPGA にも CPU が搭載されるようになり、ソフトウェアの必要性は高くなってきました。
今回は組み込みなどでよく使われる C 言語の研修で起きた問題を解決していきます。
初期値問題
以前 HDL では初期値の入力が必要だということが梅おにぎり先輩の記事に載っていました。
実は C 言語でも、この初期値問題が存在し、私も幾度となく悩まされました。
梅おにぎり先輩の記事では、初期値問題はシミュレーション時の問題でした。
しかし、C 言語の場合は実際の動作に影響を及ぼす大問題になってしまう可能性があります。
さて、C 言語で、初期値が設定されていないとどうなるでしょうか?
例えば、0 ~ 9 までの数字をコンソールに表示するプログラムを考えます。
ループ文を使って表示させてみます。
ループ文には主に for 文と while 文があります。
同じプログラムを for 文と while 文で書いてみました。
test1 コード ( for )
test2 コード ( while )
正しくできたと思い、それぞれを実行してみました。
test1 出力結果
test2 出力結果
あれ?
for 文ではちゃんと出力されるのに、 while 文では何も表示されません。
???
どこがいけなかったのでしょうか。
原因究明
今回のプログラムは非常にシンプルです。
この中で問題になりそうなのは変数 i くらいしかなさそうです。
デバッグのために、次のように printf( ) を追加して i がどのような値になっているか確認してみました。
test3 コード
test3 出力結果
なんか、変な数字が出てきました。
あれ?こんな数字入れた覚えがないのに・・・・と思ったところで気づきました。
i に何も値を代入していません。
問題解決!?
そこで、始めに i に 0 を代入することにしました。
test4 コード
実行してみましょう。
test4 出力結果
これで正しく出力されました。
どうやら、初期値が入力されていないことが原因で変数の i に不定値が入っていたようです。
今回の while ループの条件は i < 10 なので、最初に i が 10 以上の値になってしまっていると、そもそもループが始まりません。
そのため while ループに入ることなく終了していたようです。
これでは、何も表示されませんね。。。
初期値の入力が非常に大切なことが分かりました。
まとめ
for ループの時にはなかなか忘れない初期値入力も while になれば忘れがちになります。
初期値を入力しなければ、変数はどんな値になるか分かりません。
バグの原因になるので気を付けなければならないと心に刻みました。
ダックのC言語 関連記事
組み込みシステムには欠かせないC言語その基礎を分かりやすく解説!
初期値問題 ver.C言語
初期値忘れがトラブルの原因に!?
実は同一人物!?配列とポインタ
配列とポインタ、似ているようで違うこの二つを使い分ける!
malloc~未知への挑戦~
C言語の特徴ともいえる、メモリの使い方について解説!
人には読めない?バイナリファイルの謎
文字として読めないそのファイルの中身には何がある!?