[H8-ML(5841)] Re: sprintfの結果が表示されない
From: FUJIWARA Keiichi <keiichi@xxxxxxxxxxxxx>
Date: 2006年02月19日(日)08時38分34秒
藤原と申します。
具体的なところには詳しくないので、一般論になりますが。

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


スレッド概略
[5833(R)](起点)
 └[表示中]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]