ненулевое число с плавающей запятой генерируется как \0 в sprintf

Я работаю с создателем 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'

Целые числа, которые я пытаюсь напечатать в следующей строке, ведут себя так, как ожидалось.

Кто-нибудь сталкивался с подобной проблемой?


person Typhaon    schedule 05.11.2020    source источник
comment
Не уверен, что это причина проблемы, но формат %1.1f выглядит немного странно. Это запрашивает (общую) ширину 1 символа и 1 цифры после запятой. Попробовать %3.1f?   -  person Adrian Mole    schedule 05.11.2020
comment
@AdrianMole Первый 1 — это минимальная ширина, а не общая ширина. Все равно немного странно. Сомневаюсь, что это часть проблемы.   -  person chux - Reinstate Monica    schedule 05.11.2020
comment
Использует ли код правильный прототип для sprintf()? Правильное связывание?   -  person chux - Reinstate Monica    schedule 05.11.2020
comment
не удается воспроизвести godbolt.org/z/346q37 голосование за закрытие   -  person 0___________    schedule 06.11.2020
comment
@AdrianMole, ты прав, не надо было добавлять 1 перед точкой. Но проблема не в этом.   -  person Typhaon    schedule 06.11.2020
comment
В этом сообщении я нашел: cypress.com/comment/305501, что настройка размера кучи может помочь . В этом сообщении stackoverflow.com/ questions/28746062/ упоминается, что это может быть проблема с компоновщиком (который намного выше моего уровня навыков). Завтра протестирую и сообщу, если это будет исправлено.   -  person Typhaon    schedule 06.11.2020
comment
@P__JsupportswomeninPoland Это потому, что вы работаете с другой цепочкой инструментов. Я сообщу для дальнейшего использования, если найду рабочее решение. Я уже нашел две возможности, смотрите другие мои комментарии.   -  person Typhaon    schedule 06.11.2020
comment
@Typhaon, ты должен упомянуть UC. По умолчанию большинство реализаций не печатают числа с плавающей запятой. Вам необходимо: -u_printf_float   -  person 0___________    schedule 06.11.2020
comment
@P__JsupportswomeninPoland Я уже говорила, что сделала это в своем исходном посте.   -  person Typhaon    schedule 06.11.2020
comment
@chux-ReinstateMonica Можете ли вы уточнить? что вы имеете в виду под правильным прототипом? sprintf отлично работает с целыми числами и с плавающей запятой, равной 0.   -  person Typhaon    schedule 06.11.2020
comment
@Тифаон не имеет значения   -  person 0___________    schedule 06.11.2020
comment
@Typhaon Без прототипа функции для sprintf(), 1) компилятор может не компилировать код (что он, по-видимому, сделал для вас), 2) делать предположения о типах (что было бы проблемой с несовместимостью char */int или 3), возможно, работать нормально.   -  person chux - Reinstate Monica    schedule 06.11.2020