Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как sprintf() работает с float числами?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Александар
Q правильно преобразуется, а E не понятно как.
в прикрепленном файле содержимое массива Str после выполнения функции.

#include <avr/io.h>
#include <stdio.h>

unsigned char Q=5;
char Str[16];
double E=2.15;
int main(void) //
{

sprintf(Str, "Q=%d E=%2.2f %s",Q, E, "FFF");
__asm__ volatile("nop");

}
bzx
Можно попытаться поиграться в настройках компилятора с опциями sprintf
GDI
В ИАРе надо было бы включить поддержку float в функциях printf, sprintf - по-умолчанию она выключена
aesok
RTFM:
Цитата
Since the full implementation of all the mentioned features becomes fairly large, three different flavours of vfprintf() can be selected using linker options. The default vfprintf() implements all the mentioned functionality except floating point conversions. A minimized version of vfprintf() is available that only implements the very basic integer and string conversion facilities, but only the # additional option can be specified using conversion flags (these flags are parsed correctly from the format specification, but then simply ignored). This version can be requested using the following compiler options:


-Wl,-u,vfprintf -lprintf_min

If the full functionality including the floating point conversions is required, the following options should be used:


-Wl,-u,vfprintf -lprintf_flt -lm


Анатолий
MrYuran
по-моему, с ключом %f надо выводить флоты, а не даблы
По результату похоже, что неправильно распаковывается число Е.
попробуйте обозвать его float
или выводить (float)E
aesok
Цитата(MrYuran @ Apr 28 2008, 14:18) *
по-моему, с ключом %f надо выводить флоты, а не даблы
...


В avr-gcc типы float и double идентичны, по крайней мере сейчас.

Анатолий.
MrYuran
Цитата(aesok @ Apr 28 2008, 13:23) *
В avr-gcc типы float и double идентичны, по крайней мере сейчас.
Анатолий.

Ну не знаю... по крайней мере однажды у меня тоже такая галиматья выводилась, и связано это было именно с несоответствием типов выводимых переменных с ключами вывода
Александар
Добавил строку -Wl,-u,vfprintf -lprintf_flt -lm в параметры проекта в linker option, все получилось, правда код возрос. СПАСИБО!!!
Проект на AVR Studio + GCC.
ReAl
Тут уже всё решилось, но я хочу кое-что пояснить.

Цитата(MrYuran @ Apr 28 2008, 13:18) *
по-моему, с ключом %f надо выводить флоты, а не даблы
С форматом %f и остальными "плавающими" форматами, насколько я помню, всегда *printf-ом выводилось double, модификатор l (%lf и т.д.) при віводе игнорируется.
А вот *scanf-ом вводилось float по %f и double %lf.
Сейчас ещё *printf-ом по %Lf выводится long double (обратите внимание на то, что тут L большая)

Насколько я помню, для *printf при выводе float преобразовывать его вручную не нужно, так же, как не нужно вручную преобразовывать char/short к int, это делается автоматически согласно default argument promotions.
По крайней мере я никогда не преобразовывал для вывода signed/unsigned char/short к int smile.gif

Ну а у AVR, как уже было сказано, float и double совпадают, поэтому это место точно не могло быть причиной.



Цитата(MrYuran @ Apr 28 2008, 13:38) *
Ну не знаю... по крайней мере однажды у меня тоже такая галиматья выводилась, и связано это было именно с несоответствием типов выводимых переменных с ключами вывода
Ну не знаю... Если вместо int подсунуть long или float - да, будет галиматья. По цепочке от char до int и float вместо double должно всё быть нормально.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.