- ベストアンサー
c言語でint配列をdoubleに変換する方法と結果の誤差について
- c言語でマイコンプログラムを作成し、int型の配列をdoubleに変換する方法について説明します。
- プログラムを記述してテストした結果、期待した結果とは異なる値が出力される現象が発生しました。
- Visual Studio 2013 C++で同様のプログラムを実行すると、正しい結果が得られたため、原因はプログラムの問題ではなくマイコンのコンパイラのバグの可能性があります。
- みんなの回答 (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]; でいいんだが? もちろん適時キャストしたりループ使ってもいいし、二桁以上あるなら対応するようにしてだけど。
その他の回答 (3)
- wormhole
- ベストアンサー率28% (1626/5665)
プログラムがおかしいです。 Visual Studio 2013 C++では正常動作しているように見えてるだけです(本当は正常動作していないということ) >char s[4]; >sprintf(s,"%d%d%d%d",a[0],a[1],a[2],a[3]); sにNUL文字分の領域が確保されていませんのでバッファーオーバーランしてます。
お礼
ご回答ありがとうございます. char s[5]にして試行致しましたが,同じ結果になってしまいます.
- nishida0000
- ベストアンサー率25% (1/4)
すいません、あと、やはり、ビッグエンディアンと、リトルエンディアンの違いかと思います
お礼
ご回答ありがとうございます. 一度,桁が逆になっているのでは?と考え 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]); にして試行しましたが,数値が逆になって左詰めになるだけでした.
- nishida0000
- ベストアンサー率25% (1/4)
tempは、ポインタ型変数だけの宣言で、 領域は、確保してないので、 temp に mallocして、メモリ確保しないと、ngでは?
お礼
ご回答ありがとうございます. 試しにmalloc処理を記述致しましたが,同じように左詰めで表示されます. temp = (char*)malloc(sizeof(s)); d = strtod(s,&temp); 上記がテストコードです.
お礼
ご回答ありがとうございます. snprintfはコンパイル時にリンクエラーが発生したため,使用しておりませんでした.コンパイルはマイコンのIDEで行っています. 皆様にご回答いただけるのを待っている間に d = a[0] * 1000 + a[1] * 100 + a[2] * 10 + a[3]; 上記と同様のプログラムで所望の結果は出せたのですが,やはりなぜstrtodで左詰めになるのかが気になります. 皆様のアドバイスを反映させても直らないので,一度マイコンメーカーに問い合わせてみたいと考えます.