Многие инструменты разработки имеют несколько версий printf
и связанных с ними функций, которые поддерживают различные уровни возможностей. Математический код с плавающей запятой является громоздким и сложным, поэтому включение функций, которые не используются, будет тратить много пространства кода.
Некоторые инструменты автоматически пытаются определить, какие параметры должны быть включены, но некоторые из них не очень хороши, а некоторые просто требуют, чтобы программист явно выбирал подходящую версию printf
, используя аргументы командной строки, файлы конфигурации или другие подобные означает. Может потребоваться, чтобы компилятор включил версию связанных с printf функций, которая поддерживает спецификатор %f
, или же использовать другие средства форматирования вывода. Мой собственный предпочтительный подход состоит в том, чтобы преобразовать значение в масштабированное целое число (например, 100x желаемое значение), а затем написать метод, который будет выводить цифры наименее значимые сначала и вставить период после вывода некоторого количества цифр. Что-то вроде:
uint32_t acc;
uint8_t divMod10()
{
uint8_t result = acc % 10;
acc /= 10;
}
// output value in acc using 'digits' digits, with a decimal point shown after dp.
// If dp is greater than 128, don't show decimal point or leading zeroes
// If dp is less than 128 but greater than digits, show leading zeroes
void out_number(uint8_t digits, uint8_t dp)
{
acc = num;
while(digits-- > 0)
{
uint8_t ch = divMod10();
if (ch != 0 || (dp & 128) == 0)
out_lcd(ch + '0');
else
out_lcd(ch);
if (--dp == 0)
out_lcd('.');
}
}
Поскольку ЖК-модулей может быть сконфигурирован для приема данных справа налево, вывод чисел в этой форме может быть полезным упрощение. Обратите внимание, что я очень редко использую любые функции «printf» на небольших микроконтроллерах, поскольку код, подобный выше, часто намного более компактен.