|
Алгоритм нахождения праздничной даты. |
|
|
|
Feb 1 2015, 07:38
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Есть RTC. Код struct sRTC { uint8_t rtcYear; uint8_t rtcMonth; uint8_t rtcDay; uint8_t rtcDayOfWeek; uint8_t rtcHour; uint8_t rtcMin; uint8_t rtcSec;
};
extern struct sRTC rtc; Инициализирую Код rtc.rtcYear = 2015; rtc.rtcMonth = 1; rtc.rtcDay = 29; rtc.rtcDayOfWeek = 5; rtc.rtcHour = 12; rtc.rtcMin = 30; rtc.rtcSec = 10; Нужно послать сигнал когда праздник подошел . Скажем 9 Мая. Как это сделать? Думал забить таблицу праздников на 20 лет вперед и каждый час сравнивать текущую дату но подозреваю это не самое лучшее решение.
|
|
|
|
|
Feb 1 2015, 08:50
|
Знающий
   
Группа: Участник
Сообщений: 750
Регистрация: 1-11-11
Пользователь №: 68 088

|
Можно отслеживать изменение дня, и в момент изменения дня анализировать праздничную таблицу, один раз в сутки. Код static uint8_t nPrevDay = 255; if(rtc.rtcDay != nPrevDay) { nPrevDay = rtc.rtcDay;
if( (rtc.rtcDay == 13) && (rtc.rtcDayOfWeek == 5) ) { printf("Пятница 13-е !!!\r\n"); } }
Сообщение отредактировал gerber - Feb 1 2015, 10:03
--------------------
"... часами я мог наблюдать, как люди работают." (М. Горький)
|
|
|
|
|
Feb 1 2015, 10:33
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Jenya7 @ Feb 1 2015, 09:05)  если пойти прямым путем то раз в сутки мне нужно перебрать все праздничные даты и сравнить с моей, так я знаю наступила праздничная дата или нет. а что если так. взять первый праздник в году и от него отсчитывать дни. при старте системы посчитать где наша дата по отношению к первому празднику. и потом обрабатывать случаи. скажем прошло сто дней - значит второй праздник, 150 дней - третий праздник и.т.д. There are many ways to skin a cat. Можно, например, завести битовый массив длинной 365 бит  Если единичка установлена, то в соотв. день - просто праздник какой-то! Получается типа однобитной хэш-таблицы. Некоторая проблема возникнет, если на один день приходится несколько праздников.
|
|
|
|
|
Feb 1 2015, 11:23
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(Jenya7 @ Feb 1 2015, 11:15)  мне кажется что работа с таким массивом не отличается от перебора. мне нужна оптимизация по скорости. Не понял.. ваши часы не знают, какой по счету день года сегодня ? Заведите тогда еще и счетчик дней с 1 Января.
|
|
|
|
|
Feb 2 2015, 06:11
|
Частый гость
 
Группа: Validating
Сообщений: 124
Регистрация: 10-08-05
Пользователь №: 7 502

|
На эти грабли уже наступали? Или это просто пример с потолка? Цитата(Jenya7 @ Feb 1 2015, 14:38)  Код struct sRTC { uint8_t rtcYear; }; Код rtc.rtcYear = 2015;
|
|
|
|
|
Feb 2 2015, 08:23
|
Знающий
   
Группа: Свой
Сообщений: 565
Регистрация: 22-02-13
Пользователь №: 75 748

|
Цитата(alexeyv @ Feb 2 2015, 07:35)  И никаких переборов. Не понял, откуда берутся переборы? Не проще ли создать массив uint32_t holidays[12], в котором, как предложил CrimsonPig, будут отмечены единичными битами праздники. В данном случае даже счетчик числа дней от начала года не нужен. По rtcMonth выбираем месяц из массива, по rtcDay выделяем нужный бит и проверяем его на равенство единице.
|
|
|
|
|
Feb 2 2015, 08:36
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(Grizzzly @ Feb 2 2015, 14:23)  Не понял, откуда берутся переборы? Не проще ли создать массив uint32_t holidays[12], в котором, как предложил CrimsonPig, будут отмечены единичными битами праздники. В данном случае даже счетчик числа дней от начала года не нужен. По rtcMonth выбираем месяц из массива, по rtcDay выделяем нужный бит и проверяем его на равенство единице. а почему 12 элементов? тогда нужен второй вектор - дни в месяце. Цитата(nill @ Feb 2 2015, 12:11)  На эти грабли уже наступали? Или это просто пример с потолка? я потом делаю +/- 2000
|
|
|
|
|
Feb 2 2015, 13:34
|
Местный
  
Группа: Свой
Сообщений: 271
Регистрация: 6-12-11
Из: Taganrog
Пользователь №: 68 701

|
Мне кажется, что предложение alexeyv было самым сбалансированным, только недожёванным. Иметь массив из 10-40 (с Днями Пограничника) пар чисел: (месяц, день) не займёт много памяти, ну и переменную i -- позицию, которую мы ждём. А сравнить с текущими 2 полями структуры времени, когда захочется -- недолго. Совпало -- пискнули наружу, инкрементировали i и обнулили её, если "заступ" за границу массива -- и опять ждём... Больше одного раза на совпадение такая схема не сработает -- сразу же начинается ожидание следующего праздника. И праздников не один, чтобы циклить по одному месту. От объёма "праздности" код не зависит. Вроде ж праздники у нас от года к году не прыгают, чтобы хранить их на 10 лет вперёд ? Ну только если что-то добавится/убавится Думой официально -- так это любую софтину придётся корректировать. P.S. Единственный минус -- нужно задать правильное значение i при пуске системы, просчитать позицию умозрительно, а то первый "писк" может быть только через год  Т.е. для "совсем мозговитости" этого куска программы можно сравнивать текущее время не только с "[i]"-й позицией, но и "[i-1]"-й, и если "не туда попали" стартовой настройкой, то сдвигать её вперёд. Через несколько временных интервалов проверки система придёт в нормальное состояние.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|