2009-09-04 25 views
5

私は自分のアプリケーションを移植可能なものにしたいと思います。しかし、 私は、特定のマシンのstdlibからprintfにいくつかの問題があると聞いています。 意図したとおりに動作しません。たとえば、変換指定子 %fを使用すると、特定のアーキテクチャでprintfの実装 に出力に小数点が含まれることがあります。printfの実装をテストしてください

stdlibの実装の意味の正しさをテストするために、特にprintf ルーチンを使用できるいくつかのテストルーチンがあれば、私は疑問に思っています。たぶん、プログラムを移植するときにいくつかの問題を指摘する良いリソースがありますか?

多くのおかげで、 ハインツ

+0

出力の小数点と間違って何? IMOは移植性よりもl10nに関連しています。 –

+0

テスト用に使用すると、基本的には異なるプラットフォームで異なる出力が得られます。これは、値そのものは同じですが、小数点のためにテストが失敗する可能性があることを意味する可能性があります。 –

+3

@Heinzでは、テストコード(つまり、setlocale(LC_NUMERICAL、 "C"))でロケールを "C"に設定できます。これは常に小数点を出力するはずであり、コンマなどは出力しません。 – quinmars

答えて

1

あなたはあなたに関係の問題をカバーし、独自のテストスイートを記述する必要があります。入力を変えてprintfを100回呼び出すのは非常に簡単です。出力は単純なテキストなので、期待する出力に対して簡単にチェックできます。

4

私はPostel's law(「あなたがしていることを保守して、他人から受け入れるものでリベラルである」と思う)もここでも当てはまります。 printf()の実装が機能していると考えるために、文字ごとの一致が必要なテストを書いてはいけません。

代わりに、より高いレベルにしてください。 printf()によって出力されたテキストを予想されるデータ型に解析し、その型の値と比較します。 「2.25」を印刷する場合は、テキストを解析し(strtod()または同等物を使用)、実際の文字列「2.25」ではなく実際の数値2.25と比較する。

0

sprintf()を使用していくつかのテストテンプレートを作成し、それらを "正しい"ものと比較することをお勧めします。

私はfprintfを使ってこのようなことをしました(私たちの組み込みシステムでのキャッシュを避けるためです)。

printfとsprintfの結果が変わらないと思います。フォーマットアルゴリズムは同じです。

+0

ほとんどの場合、すべてのprintfファミリが共通の実装を使用するため、アルゴリズムは同じです。ある家族を他の家族と比較すると、同じ回答が得られたことだけが確認されますが、正しい答えかどうかを判断するのに役立ちません。 – RBerteig

関連する問題