ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
22 ноября
516353 Топик полностью
il-2 (19.05.2014 08:44 - 22.05.2014 15:56, просмотров: 230) ответил SciFi на А что не так с mktime()? Нужно вычислять на этапе компиляции?
Да. Уффф, готово.  // Сам макрос // +Jan +Feb +Mar +Apr +May +Jun +Jul +Aug +Sep +Oct +Nov +Dec #define MK_TIME(d,m,g) (((d)-((((m)>2)||((g)&0x03))?0:1)+(((m)>1)?31:0)+(((m)>2)?28:0)+(((m)>3)?31:0)+(((m)>4)?30:0)+(((m)>5)?31:0)+(((m)>6)?30:0)+(((m)>7)?31:0)+(((m)>8)?31:0)+(((m)>9)?30:0)+(((m)>10)?31:0)+(((m)>11)?30:0)+(((m)==13)?31:(((m)>14)?(((m)-14)*30+365):0))+(((g)-1968)>>2)*1461L-731+((g)&0x03)*365UL)*86400UL) // Код для проверки static const UINT Days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; struct tm DtTm; UINT Err = 0; UINT Year=1970, Mon, Day, TopDay; time_t mk_time, mac_time; do { Mon = 1; do { Day = 1; TopDay = Days[Mon-1]; if ( (Mon == 2) && ((Year & 0x03)==0) ) ++TopDay; do { DtTm.tm_year = Year - 1900; DtTm.tm_mon = Mon - 1; DtTm.tm_mday = Day; DtTm.tm_hour = 0; DtTm.tm_min = 0; DtTm.tm_sec = 0; mk_time = mktime(&DtTm); if ( mk_time == (time_t)-1 ) { Err = 1; goto test_err; } if ( DtTm.tm_year != (Year - 1900) ) { Err = 2; goto test_err; } if ( DtTm.tm_mon != (Mon - 1) ) { Err = 2; goto test_err; } if ( DtTm.tm_mday != Day ) { Err = 2; goto test_err; } if ( DtTm.tm_hour != 0 ) { Err = 2; goto test_err; } if ( DtTm.tm_min != 0 ) { Err = 2; goto test_err; } if ( DtTm.tm_sec != 0 ) { Err = 2; goto test_err; } mac_time = MK_TIME(Day,Mon,Year); if ( mac_time != mk_time ) { Err = 3; test_err: Err = 0; } } while(++Day <= TopDay ); } while( ++Mon <= 12 ); } while( ++Year != 2200 );