#1 2016-03-31 16:53:11

kolio
Учасник
Зареєстрований: 2016-03-31
Повідомлень: 9

от unsigned long равный 1 отнять минус 10. что будет?

долго думал как назвать тему smile буду краток

1. есть переменная unsigned long timeToBegin = 10800000; //1000*60*60*3 //3 часа
2. условно говоря когда нажимаем кнопку то засекается время старта unsigned long modeStartedAt
3. timeToBegin уменьшается в цикле loop вот так: timeToBegin = millis() - modeStartedAt;
4. потом идет проверка:
     if (timeToBegin > 0) {//еще не время?
            break;
          } else {
            timeToBegin = 0;
          }

5. цикл может длиться 1мс, а может и 2 сек, то есть теоретически когда timeToBegin станет 1, а в следующем цикле окажется, что millis() - modeStartedAt меньше нуля - то что будет со значением присвоенным timeToBegin?

получается что от беззнаковому числу пытаются присвоить минусовое значение. получается что моя проверка на > 0 отработает неверно?

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

Остання редакція kolio (2016-03-31 16:54:07)

Неактивний

#2 2016-03-31 17:03:32

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: от unsigned long равный 1 отнять минус 10. что будет?

"unsigned long равный 1 отнять минус 10. что будет? "
(unsigned long )1 - (-10) = 11 %)

temp =  millis();
if (temp > modeStartedAt )
{
timeToBegin = millis() - modeStartedAt;
}
else
timeToBegin = 0;

код не читаемый  (
по телу вопроса написал  пример

Неактивний

#3 2016-03-31 17:09:14

kolio
Учасник
Зареєстрований: 2016-03-31
Повідомлень: 9

Re: от unsigned long равный 1 отнять минус 10. что будет?

спасибо за ответ
я про уловку понял
у меня уловка по сути такая же:

long delta = millis() - modeStartedAt;
if (timeToBegin > delta) {
      timeToBegin -= delta;//уменьшаем время до старта
      modeStartedAt = millis();
} else {
      timeToBegin = 0;
}

вот только не понял причем тут 1 - (-10)
у меня ведь вопрос в: unsigned long var = 1-10 = ?

Остання редакція kolio (2016-03-31 17:20:18)

Неактивний

#4 2016-03-31 17:21:23

kolio
Учасник
Зареєстрований: 2016-03-31
Повідомлень: 9

Re: от unsigned long равный 1 отнять минус 10. что будет?

хитрость просто в том, что у меня в цикле та самая timeToBegin может дополнительно уменьшаться по определенным условиям

Неактивний

#5 2016-03-31 17:45:43

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: от unsigned long равный 1 отнять минус 10. что будет?

я так делаю

TE_TIMER programm_count_down_ulong ( unsigned long *timer , unsigned short shift )
{
	  if (*timer > 0 )
	  {
		  if (*timer > shift )
		  {
			  *timer -= shift;
			  return TIMER_RUN;
		  }
		   else
		  {
			   *timer = 0;
			   return TIMER_EXE;
		  }
	  }
	return TIMER_DISABLED;
}

	 if (  TIMER_EXE ==  programm_count_down_ulong ( &Time_Next_effect, time ))
	 {
		 Executed (); 
// на выполнение когда счетчик дошел до нуля
где time значение на которое нужно уменьшить счетчик 
	 }

Неактивний

#6 2016-03-31 18:29:12

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: от unsigned long равный 1 отнять минус 10. что будет?

"отнять минус 10. "   это - (-10)
не удержался )

Неактивний

#7 2016-03-31 19:26:34

kolio
Учасник
Зареєстрований: 2016-03-31
Повідомлень: 9

Re: от unsigned long равный 1 отнять минус 10. что будет?

упс. то я прогнал
я имел ввиду отнять 10 smile заговорился

Неактивний

#8 2016-03-31 19:45:45

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: от unsigned long равный 1 отнять минус 10. что будет?

typedef enum {
TIMER_EXE         = 0,
TIMER_DISABLED  = 1,
TIMER_RUN       = 2,
}TE_TIMER;

объявление
а то не соберется пример

мой код понятен ?

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму