1

今日、ARM ツールチェーン EABI (クロスコンパイラ) で奇妙な問題に直面しました。

この問題は、浮動小数点値を string に変換するために snwprintf() を使用しようとしたときに、渡した実際の浮動小数点値を持たないジャンク文字列を取得していたことです。

サンプルコードは次のようになります。

float floatValue = 1.0;
snwprintf (buffer, bufferSize, _T("%g"), floatValue);

その後、snwprintf をデバッグしたところ、可変引数リスト (va_arg) が正確なデータ値を指していないことがわかりました。そして、メモリをダンプすることで、可変引数リストに存在する正確なデータを見つけることができました。va_arg が指すデータが異なります。

統合値が正常に機能しているため、これはエンディアンの問題ではないと思います。問題は double 値のみです。

誰でもこの問題で私を助けることができますか?

4

1 に答える 1

1

float は可変個引数関数の double に拡張されるため、double としてフォーマット/出力する必要があります。

Procedure Call Standard for the ARM Architecture は次のように述べています。

5.5 パラメータ
の受け渡し 可変引数関数は、基本標準と同様に常にマーシャリングされます。

7.2 引数受け渡し規則
可変個引数関数の場合、省略記号 (…) に一致する float 引数は double 型に変換されます。

Afaik 7.2 は一般に C に当てはまります。

于 2012-10-12T06:10:08.957 に答える