2016-07-28 2 views
-1
double d = 3.3; 
char str[50]; 
sprintf(str, " \t%f", d); 
USBD_VCOM_SendString(str); 

Требуется отправить двойной из моего μController на свой компьютер, но str всегда швы, чтобы быть пустым. Пробовал это с int тоже, и он работал нормально. Также не работает для float. Я использую компилятор ARM-GCC C.Невозможно преобразовать float или double в char array (sprintf)

+0

Похоже, что форматирование чисел с плавающей запятой не реализовано в вашем CRT. –

+0

Спасибо. Это звучит как большая проблема. Любые другие способы преобразования float или double в массив char? – Shilence

+0

Я не совсем уверен, это просто _looks_ так. Изучите документацию и/или исходный код CRT, который должен быть доступен. –

ответ

0

3 вопроса, которые необходимо решить.

1) Некоторые компиляторы, даже с *printf() помощью спецификаторов с плавающей точкой, сделать не включают поддержку FP, если код не имеет FP математики в другом месте в коде. Код защиты использует FP в другом месте или что компилятор не имеет этого ограничения.

2) Используйте буфер и спецификатор *printf(), который не будет переполняться. @Jonathan Leffler
"%e", а не "%f" - это простой способ избежать чрезмерно длинных строк.

3) Печать с sufficient precision.

#include <float.h> 
//  - d .  ddddddd    e - expo \0 spare 
char str[1 + 1 + 1 + (DBL_DECIMAL_DIG - 1) + 1 + 1 + 5 + 1 + 10]; 
snprintf(str, sizeof str, "%.*e", DBL_DECIMAL_DIG - 1, d); 

USBD_VCOM_SendString(str); 
Смежные вопросы