皆様こんにちは。
sprintf関数の振る舞いで、プログラムを動作しているとバグ?が発生し
質問させて頂きました。現在の環境は以下の通りとなります。
開発環境:HEW4
コンパイラ:RXファミリ用C/C++コンパイラ
使用している言語:C/C++
使用しているマイコン:AP-RX63N-0A
用途としましては、char型配列に(1024byte)に半角文字列(数値もありますので書式付フォーマット使用)を挿入して
データを送信する仕様であります。
動作していくとある回数(不定)でchar型配列に["ABC:%4d volt"]のように配列が入り、数値が入らず書式付フォーマットの%dが
そのまま配列に入るようになりました。マイコンをリセットしないとバグは解決しませんでした。
バッファは十分余裕があり、オーバーランはしていないようです。
原因が分からなかったため、質問させて頂きました。
以上宜しくお願い致します。
原因究明の前にアレコレ弄ってるうちに「いつの間にか直った(現象が現れなくなった)」というのが一番厄介なので、とりあえず問題の発生の確認できているプログラムをプロジェクト丸ごとアーカイブするか何かで保存されることをお勧めします。
> char型配列に["ABC:%4d volt"]のように配列が入り、数値が入らず書式付フォーマットの%dがそのまま配列に入るようになりました。 と > sprintf(disp_buff, "C1:%1.02fV C2:%1.02fV C3:%1.02fV", m_AdVolt[CH1], AdVolt[CH2], AdVolt[CH3]); > 3回目以降などに%dが直接出力されました。 で書式が異なっていますが、相談されてる問題の現象は正確なものですか?
最近の CC-RX の更新情報を見てみると tool-support.renesas.com/.../CC-RX_List.html > V2.02.00 → V2.03.00 への変更点 (2015/2/5) > 2. 標準ライブラリのリエントラント化対応 [C標準ライブラリ(ライブラリジェネレータ)] > ライブラリジェネレータ(lbgrx)に-reentオプションの指定により、リエントラント化されたC標準ライブラリを > 作成できるようにしました。生成されたC標準ライブラリに、3つの低水準関数をお客様にて 作成いただくことで、 > rand/srand関数を除くC言語標準ライブラリ関数をリエントラント化することができます。 とありますが、HEW で使用しているであろうもっと古い版の CC-RX でのライブラリはリエントラントにはなってないと思われます。割り込み中で sprintf() を使用されるのであればその点注意が必要です。
「リエントラントライブラリを生成(G)」にチェックを入れてビルドすると
L2310 (E) Undefined external symbol "_errno_addr" referenced in "xwctomb"
というエラーが出るな。
void* errno_addr;
とか宣言すりゃ消えるけど正しくはどうすんだろう?