关于minilibc中函数的几点疑问
在time.c中time_t timegm(struct tm *const t)函数time_t timegm(struct tm *const t)
{
register time_tday;
register time_ti;
register time_t years = t->tm_year - 70;
if(t->tm_sec>60)
{
t->tm_min += t->tm_sec/60; t->tm_sec%=60;
}
if(t->tm_min>60)
{
t->tm_hour += t->tm_min/60; t->tm_min%=60;
}
if(t->tm_hour>60)
{
t->tm_mday += t->tm_hour/60; t->tm_hour%=60;
}
if(t->tm_mon>12)
{
t->tm_year += t->tm_mon/12; t->tm_mon%=12;
}
while(t->tm_mday>__spm)
{
if(t->tm_mon==1 && __isleap(t->tm_year+1900))
{
if(t->tm_mon==31+29)
{
break;
}
--t->tm_mday;
}
t->tm_mday-=__spm;
++t->tm_mon;
if(t->tm_mon>11)
{
t->tm_mon=0;
++t->tm_year;
}
}
if(t->tm_year < 70)
return(time_t) -1;
/* Days since 1970 is 365 * number of years + number of leap years since 1970 */
day= years * 365 + (years + 1) / 4;
/* After 2100 we have to substract 3 leap years for every 400 years
This is not intuitive. Most mktime implementations do not support
dates after 2059, anyway, so we might leave this out for it's
bloat. */
if((years -= 131) >= 0)
{
years /= 100;
day -= (years >> 2) * 3 + 1;
if((years &= 3) == 3) years--;
day -= years;
}
day += t->tm_yday = __spm + t->tm_mday-1 + ( __isleap (t->tm_year+1900)&(t->tm_mon > 1) );
/* day is now the number of days since 'Jan 1 1970' */
i = 7;
t->tm_wday = (day + 4) % i; /* Sunday=0, Monday=1, ..., Saturday=6 */
i = 24;
day *= i;
i = 60;
return((day + t->tm_hour) * i + t->tm_min) * i + t->tm_sec;
}
1:if(t->tm_hour>60)
{
t->tm_mday += t->tm_hour/60; t->tm_hour%=60;
}
小时>60??一般不会出现这种情况吧
2: while(t->tm_mday>__spm)
{
if(t->tm_mon==1 && __isleap(t->tm_year+1900))
{
if(t->tm_mon==31+29)
{
break;
}
--t->tm_mday;
}
t->tm_mday-=__spm;
++t->tm_mon;
if(t->tm_mon>11)
{
t->tm_mon=0;
++t->tm_year;
}
}
if(t->tm_mon==31+29) 这条判断语句还有用吗? 很多地方是为了保险起见的。 例如第二条,if(t->tm_mon==31+29)语句永远也执行不到,还有意义吗 t是函数参数传入的,具体你查查struct tm的用法。 if(t->tm_mon==1 && __isleap(t->tm_year+1900))
{
if(t->tm_mon==31+29)
{
break;
}
--t->tm_mday;
}
t->tm_mon==1 条件成立后才进去if的,那break语句是不是永远也执行不到呀, 唔,没看仔细,抱歉。这个条件判断确实有问题,需要把它给清除掉,谢谢。 if(t->tm_hour>60)
{
t->tm_mday += t->tm_hour/60; t->tm_hour%=60;
}
我感觉还是有问题,应该是>24,你看是不是,很高兴能为RTT出点力 哈哈 我准备好好研究一下RTT以后产品上用 yygymmq用的是哪类平台?目前来说,RT-Thread仅在GCC上,且不使用newlib的情况下才会使用minilibc。所以minilibc更新也比较少,检查得也比较少。这段应该是复制引起的典型错误,人力所限,minilibc还处于无人维护的阶段~~ 我是在KEIL下开发,最近由于用了KEIL的库,我觉的实现的好像有点问题,可是我又看不到KEIL的库,所以想到了看看RTT的库,就发现了这个问题,呵呵 我有时间再检查一下其他的库吧,目前就看了一下time.c
页:
[1]