藤原と申します。
具体的なところには詳しくないので、一般論になりますが。
This message is reply to mozilla_315 - san
(Subject was : [H8-ML(5833)] sprintfの結果が表示されない)
Message-ID: <43F5A2B0.4000300@xxxxxxxxx>
in Fri, 17 Feb 2006 19:17:20 +0900 ...
>
> char ans_str[30] = "";
> char siki[20] = "+62.9";
> double answer = 321.45;
>
> answer = answer + atof(siki);
> sprintf(ans_str, "%+f", answer);
調べる手順は、たとえば以下の手順になると思います。
1.sprintf() 直後の、ans_str の内容をデバッガでチェックする。
→ 妥当なら、sprintf() 以降、この内容がおかしいのなら、sprintf()
以前に問題あり。
問題が sprintf() 以前の場合は、以降のチェック
2.answer + anser + atof(siki); の行をコメントアウトしてチェック
→ これでOKなら、atof() の使い方に問題。
NGなら、sprintf()の問題
※ atof() は、double を返す関数なので、プロトタイプ宣言(必要な
ヘッダファイルの include)が必須です。
これがないと、コンパイラは、atof() が返してきた double を
int とみなして、さらに、キャストしようとしますまたは、double
と int では、返値の渡し方が違うので、int の手順に従ってでたらめ
な返値をとってきます。
3.sprintf() も同じく、適切なヘッダファイルが include されていないと、
問題を起こす可能性が高くなります。
printf() 系を含む可変個数引数を受け入れる関数は、引数の受け入れ
機構が特殊な場合があり、この場合は、ヘッダファイルの宣言で、可変
個数引数を扱う関数だと知らせないと、間違った引数の引き渡しをします。
4.sprintf() に問題が絞られた時点で、たとえば、
sprintf(ans_str, "ANS");
sprintf(ans_str, "ANS=%+f", 1.0);
のような、単純な引数を渡してチェックしてみます。
これでNGであれば、既に回答があるように、sprintf() 周辺の設定の
問題となります。
最後に、「うまくいかないみたいです」という質問の方法は、やはり、あまり
良くないと思います。
・全く表示されません。
・表示がでたらめです
→ いつも同じように「でたらめ」です or 毎回表示内容が違います
・引数が「〜」の時にはうまくいきます。
・sprintf() 直後の asn_str は正常です or この時点でNGです。
などの情報を含んでいれば、解決の糸口は、よりつかみやすいと思います。
最後にちょっと宣伝をば。
-------------------------------------------------------------------
浮動小数点(double)と、文字列の相互変換のライブラリを書いてみました。
double -> n 桁+.+ m 桁 の文字列
文字列 -> double
の変換を行います。(現在のバージョンでは、最終桁に±1の誤差が出る
ケースがあります)
http://www.asahi-net.or.jp/~ig5k-fjhr/tec/strnum.h
http://www.asahi-net.or.jp/~ig5k-fjhr/tec/strnum.c
http://www.asahi-net.or.jp/~ig5k-fjhr/tec/libfloat.h
http://www.asahi-net.or.jp/~ig5k-fjhr/tec/libfloat.c
浮動小数点のライブラリは、libfloat の方ですが、strnum
(こちらは、整数と文字列の関連ライブラリ)に依存しているので、
両方必要です。
--------------------------------------------------------------------
--
今日は雨水 (04:26)です。
_/ -- Last -224 hours until Torino 2006 Olympic Games -------------
_/ FUJIWARA Keiichi
_/ E-Mail : keiichi@xxxxxxxxxxxxx <or> k1@xxxxxxxxx
_/ URL : http://www.keiichi.fujiwara.name/
------------------------------------------+----- Luna Phase 19.96 --
PGP FingerPrint = 7CC3 4F95 8CC7 87D3 7178 C348 CD65 7F08 D68F 69F6