Проблема с преобразованием ЧЧ:ММ:СС в секунды

Angbor
Angbor аватар
Offline
Зарегистрирован: 26.10.2015

Уперся в странный результат при переводе часов-минут-секунд в секунды

Время получаю с RTC. Вот код

  // текущее время 14:26:34
  unsigned long mytime = hour(t)*60;
  Serial.println(mytime); // выдает ожидаемые минуты 840
  mytime = (mytime + minute(t)) *60;
  Serial.println(mytime); // теперь добавляем минуты и переводим в секунды 51960, тоже ОК 
  mytime = mytime + second(t);
  Serial.println(mytime); // ну и в результате 51994
  unsigned long mytime2 = hour(t)*60*60 + minute(t) *60 +second(t);
  Serial.println(mytime2); // теперь сводим все в одну строку и получаем 4294953754.... Холмс, но как?

В итоге совершенно два разных результата.
Можно, конечно, оставить пошаговое суммирование, но как-то не серьезно выходит

Очевидно, я упускаю что-то простое - но не вижу. Хелп.

Angbor
Angbor аватар
Offline
Зарегистрирован: 26.10.2015

Да, в начале

setSyncProvider(RTC.get); 
time_t t = now();

 

b707
Offline
Зарегистрирован: 26.05.2017

а если так:

unsigned long mytime2 = hour(t)*60*60UL + minute(t) *60 +second(t);

 

Angbor
Angbor аватар
Offline
Зарегистрирован: 26.10.2015

Работает :) спасибо

в чем была фишка? hour(t)*60*60 не преобразовывался, а оставался в int?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

еще раз подумате над разницей:

void setup() {
Serial.begin(57600);
while(!Serial);

}

void loop() {
unsigned long uull = 14*60*60 + 42*60 + 15;

unsigned long uul1 = 14*60ul*60 + 42*60 + 15;

Serial.print ("Неправильно:");
Serial.println(uull);

Serial.print ("  Правильно:");
Serial.println(uul1);

delay(2000);
}

Это называется "стандарт языка", каждая арифметическая операция производится в формате того оператора, который "точнее" в неком смысле.

Если один лонг - то в лонге, если флоат, то с плавающей точкой. Если НИЧЕГО НЕ УКАЗАНО, то формате int. ИНТ у нас, в ардуино - 16 разрядов.

То есть, чтобы считать в лонге нужно это явно указать, чтобы в ulong - тоже указать. иначе компилятор делает код, который считает в инт.

Angbor
Angbor аватар
Offline
Зарегистрирован: 26.10.2015

я по непонятной причине полагал, что компилятор это проверит и предупредит :)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Angbor пишет:

я по непонятной причине полагал, что компилятор это проверит и предупредит :)

Просто компилятор намного умнее Вас. Он с дураками не спорит... 

Angbor
Angbor аватар
Offline
Зарегистрирован: 26.10.2015

...