странности со sprintf
- Войдите на сайт для отправки комментариев
Пнд, 12/09/2016 - 10:30
void setup() { Serial.begin(9600); } void loop() { unsigned long sec = millis() / 1000; char msg[10]; sprintf(msg, "%d:%02d:%02d", (sec / 3600) % 24, (sec / 60 ) % 60, sec % 60); Serial.println(msg); delay (1000); }
Почему-то в третьей позиции вместо секунд выводятся минуты.
Хотя если написать
sprintf(msg, "%02d", sec % 60);
то секунды выводятся корректно.
Том, уважаемый! История функции printf() и клонов восходит к первому С, еще от Кернигана и Ричи.
Описывается она в самом первом стандарте, как функция с переменным числом аргументов, примерно как main().
Все аргументы разной длинны, поэтому по первому - определяются типы и размеры того, что доставать из стека.
Вы обманули sprintf(), пообещав ему три двубайтовых целых, а положили три 4-х байтовых. Вас наказали за обман ;).
я не жадный, могу и больше дать.
Ваш код выводит только два символа:
0:
Наверное подавился :)
Но направление теперь понятно. Если в первом примере заменить long на int, то работает.
Работает!
Сорри! В двух последних модификатор ПЕРЕД "d". Все, блин, спешка моя!!
Мои извинения!!!
Вы опередили мои правки, сорри. отходил по делам
"u" необязательно, но полезно. ГЛАВНОЕ указать printf() размер аргумента в стеке. Это делает модификатор.
Я поставил перед d в первом формате, а дальше руки сами ввели Вас в заблуждение! Сорри еще раз!