Я работаю с создателем psoc и пытаюсь напечатать число с плавающей запятой между -1 и 1 на OLED-дисплее I2C. Чтобы заставить это работать, я использую функцию sprintf. Я добавил следующий флаг в свой компоновщик -u _printf_float
, потому что я использую newlib-nano, и он пропускает код обработки с плавающей запятой, если он не запрошен. (Моя проблема может быть связана с этим... может быть?) В целях тестирования я написал строки:
char stringbuffer[20];
sprintf(stringbuffer, "(%1.1f, %1.1f)", 1.1, 1.1);
Во время отладки я заметил, что каждое ненулевое число с плавающей запятой, которое я пытаюсь напечатать, печатается как мусор с нулевым символом впереди. На самом деле каждое ненулевое число с плавающей запятой заменяется следующими 3 байтами. Если я заменю все значения на 0,0, тогда он будет напечатан отлично.
0x00 '\000'
0x2E '.'
0x80 '\200'
Целые числа, которые я пытаюсь напечатать в следующей строке, ведут себя так, как ожидалось.
Кто-нибудь сталкивался с подобной проблемой?
%1.1f
выглядит немного странно. Это запрашивает (общую) ширину1
символа и1
цифры после запятой. Попробовать%3.1f
? - person Adrian Mole   schedule 05.11.20201
— это минимальная ширина, а не общая ширина. Все равно немного странно. Сомневаюсь, что это часть проблемы. - person chux - Reinstate Monica   schedule 05.11.2020sprintf()
? Правильное связывание? - person chux - Reinstate Monica   schedule 05.11.2020sprintf()
, 1) компилятор может не компилировать код (что он, по-видимому, сделал для вас), 2) делать предположения о типах (что было бы проблемой с несовместимостьюchar */int
или 3), возможно, работать нормально. - person chux - Reinstate Monica   schedule 06.11.2020