реклама на сайте
подробности

 
 
> sprintf от Keil, мусор после полезной строки
firstvald
сообщение Nov 18 2014, 23:07
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 580
Регистрация: 3-06-08
Пользователь №: 38 041



во франклине (для работы с плав арифметикой не использую, но спецэффект видел) и в кейле сталкиваюсь с тем, что sprintf мусорит в строке после полезной части. при выводе плавающего числа со спецификатором f4.1 после полезной части кидается еще байт так 9 мусора. обычно обхожу это тем, что завожу большую строку с запасом, фактически для вывода плавающего числа по спецификатору f4.1 требуется строка длиной 24 байта (с некоторым запасом), но может быть кто- то нашел лечилку?


в порядке пожарного бубна

может кому срочно поможет, как посмотрю подробнее еще отпишусь. вроде бы мусор исчезает, если вызвать последовательно сначала sprintf без поля точности: sprintf(...,"%f",....) и сразу же еще раз, но уже как нам нужно sprintf(...,"%4.3f",...).
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
psL
сообщение Dec 7 2014, 10:35
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



А зачем все эти телодвижения с обнулением памяти и записью массива? По идее достаточно такого:
Код
char specif[] = "%4.2f";

ну или такого, слегка параноидального:
Код
const char specif[] = "%4.2f\0";

возможно у вас массивы заданы как локальные переменные (в стеке), либо каким-то образом повреждается сегмент статических данных.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 7 2014, 11:31
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(psL @ Dec 7 2014, 12:35) *
По идее достаточно такого:
По идее достаточно прочитать документацию. Но это для слабых. Суровые русские мужики чешут правое ухо левой ногой, изобретая свой велосипед.
Код
int digits = 4;
int decimals = 2;
sprintf(out_line, "%*.*f", digits, decimals, in_val);



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
psL
сообщение Dec 7 2014, 12:30
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



Цитата(Сергей Борщ @ Dec 7 2014, 14:31) *
По идее достаточно прочитать документацию. Но это для слабых. Суровые русские мужики чешут правое ухо левой ногой, изобретая свой велосипед.
Код
int digits = 4;
int decimals = 2;
sprintf(out_line, "%*.*f", digits, decimals, in_val);

По идее изменение формата sprintf не спасет буфер от поломки
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 00:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01265 секунд с 7
ELECTRONIX ©2004-2016