• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c言語でint配列をdoubleに変換)

c言語でint配列をdoubleに変換する方法と結果の誤差について

このQ&Aのポイント
  • c言語でマイコンプログラムを作成し、int型の配列をdoubleに変換する方法について説明します。
  • プログラムを記述してテストした結果、期待した結果とは異なる値が出力される現象が発生しました。
  • Visual Studio 2013 C++で同様のプログラムを実行すると、正しい結果が得られたため、原因はプログラムの問題ではなくマイコンのコンパイラのバグの可能性があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.4

> char s[4]; > sprintf(s,"%d%d%d%d",a[0],a[1],a[2],a[3]); こういうケースだと一般的には sprintf() じゃなく snprintf() 使うんだが、 char s[5]; snprintf(s, sizeof(s), "%d%d%d%d",a[0],a[1],a[2],a[3]); それかコスト的には for (i = 0; i < 4; i++) s[i] = a[i] % 10 + '0'; s[i] = '\0'; みたいにするか、そもそも strtod() 使う必然なければ直接 d = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3]; でいいんだが? もちろん適時キャストしたりループ使ってもいいし、二桁以上あるなら対応するようにしてだけど。

con014057
質問者

お礼

ご回答ありがとうございます. snprintfはコンパイル時にリンクエラーが発生したため,使用しておりませんでした.コンパイルはマイコンのIDEで行っています. 皆様にご回答いただけるのを待っている間に d = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3]; 上記と同様のプログラムで所望の結果は出せたのですが,やはりなぜstrtodで左詰めになるのかが気になります. 皆様のアドバイスを反映させても直らないので,一度マイコンメーカーに問い合わせてみたいと考えます.

その他の回答 (3)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

プログラムがおかしいです。 Visual Studio 2013 C++では正常動作しているように見えてるだけです(本当は正常動作していないということ) >char s[4]; >sprintf(s,"%d%d%d%d",a[0],a[1],a[2],a[3]); sにNUL文字分の領域が確保されていませんのでバッファーオーバーランしてます。

con014057
質問者

お礼

ご回答ありがとうございます. char s[5]にして試行致しましたが,同じ結果になってしまいます.

回答No.2

すいません、あと、やはり、ビッグエンディアンと、リトルエンディアンの違いかと思います

con014057
質問者

お礼

ご回答ありがとうございます. 一度,桁が逆になっているのでは?と考え sprintf(s,"%d%d%d%d",a[0],a[1],a[2],a[3]); を sprintf(s,"%d%d%d%d",a[3],a[2],a[1],a[0]); にして試行しましたが,数値が逆になって左詰めになるだけでした.

回答No.1

tempは、ポインタ型変数だけの宣言で、 領域は、確保してないので、 temp に mallocして、メモリ確保しないと、ngでは?

con014057
質問者

お礼

ご回答ありがとうございます. 試しにmalloc処理を記述致しましたが,同じように左詰めで表示されます. temp = (char*)malloc(sizeof(s)); d = strtod(s,&temp); 上記がテストコードです.

関連するQ&A