Приведение int к формату HH:MM:SS

AlexTLN
Offline
Зарегистрирован: 14.05.2016

Вопрос риторический, скорее, но может кто сталкивался. Очень интересна причина такого поведения:

1. На ардуинку заливается код, все работает исправно

2. После перезаливки(код не менялся) появляется баг в одном из кусков кода(на C# все ок работает):

      segment7 = time / 3600; //hour
      segment4 = (time - (segment7 * 60)) % 60; //min
      segment0 = time % 60; //sek
	public static void Main()
	{
		int d0,d1,d3;
		int time=7261;
  		d3=time % 60;//sek
		d0=time / 3600;//hour
		d1=(time-(d0*60))%60;//min
		Console.WriteLine(d0);
		Console.WriteLine(d1);
		Console.WriteLine(d3);
	}

3. При очередной перезаливки прошивки появляется такая вот ерунда:

4. Магическим образом ошибка компиляции сама исчезает через какое-то время, скетч заливается, но работает криво

5. Завтра буду возиться с кодом

Просто интересно, может быть кто-то в курсе... Что ЭТО было? 

И, возможно, кто-то знает более простой способ привести int к формату времени

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

char buf[12];

sprintf(buf,"%02d:%02d:%02d", H,M,S);

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Минуты может так считать ?
d1=(time%3600)/60;

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

в популярную UNO и nano в int не вмещается однако, int32_t видимо должна быть

AlexTLN
Offline
Зарегистрирован: 14.05.2016

Угу, скорее всего из-за того, что int 16ти битный. 

Поменял на uint_32 и изменил:

d1=(time%3600)/60;

Более-менее что-то заработало. Но по какой-то неведомой причине часы стали секундами, а секунды часами. Хотя изначально все было отлично. И еще пару каких-то багов с обработкой обнуления счетчика. Весело )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

int d0,d1,d3; это знаковый тип, uint32_t - нет

AlexTLN
Offline
Зарегистрирован: 14.05.2016

ua6em пишет:

int d0,d1,d3; это знаковый тип, uint32_t - нет

Так в данном случае нет никакой разницы, просто в unsigned в два раза больше влезет

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AlexTLN пишет:

ua6em пишет:

int d0,d1,d3; это знаковый тип, uint32_t - нет

Так в данном случае нет никакой разницы, просто в unsigned в два раза больше влезет

сравнивать знаковые и беззнаковые компилятор точно будет предупреждения гнать

AlexTLN
Offline
Зарегистрирован: 14.05.2016

Проблема была в том, что поставил новую версию среды разработки. Она каким-то "чудом" нашла библиотеку из старой версии, возник конфликт совместимости. Компилятор не понимал с какой версией библиотеки работать.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

AlexTLN пишет:

Проблема была в том, что поставил новую версию среды разработки. Она каким-то "чудом" нашла библиотеку из старой версии, возник конфликт совместимости. Компилятор не понимал с какой версией библиотеки работать.

чудо это простое, если версия portable то ее надо немного настроить иначе она совсем не portable )))

AlexTLN
Offline
Зарегистрирован: 14.05.2016

ua6em пишет:

чудо это простое, если версия portable то ее надо немного настроить иначе она совсем не portable )))

Не совсем так, на компе две IDE стоят 1.8.10(про эту я вообще забыл, которая была скопирована просто) и 1.8.16. Открывал код в 1.8.16, а ошибку било на 1.8.10. И тут я это увидел, и понял, что тут что то не то... Пока что решилось так: обновил библиотеку вручную через IDE, скетч загрузился.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

чудо это простое, если версия portable то ее надо немного настроить иначе она совсем не portable )))

Вот, кстати, это интересно. Какие здесь тонкости?