yygymmq 发表于 2010-7-27 09:43:19

关于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) 这条判断语句还有用吗?

ffxz 发表于 2010-7-27 14:15:33

很多地方是为了保险起见的。

yygymmq 发表于 2010-7-27 19:44:44

例如第二条,if(t->tm_mon==31+29)语句永远也执行不到,还有意义吗

ffxz 发表于 2010-7-28 07:55:22

t是函数参数传入的,具体你查查struct tm的用法。

yygymmq 发表于 2010-7-28 11:08:25

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语句是不是永远也执行不到呀,

ffxz 发表于 2010-7-28 11:53:23

唔,没看仔细,抱歉。这个条件判断确实有问题,需要把它给清除掉,谢谢。

yygymmq 发表于 2010-7-29 10:19:55

if(t->tm_hour>60)
    {
      t->tm_mday += t->tm_hour/60; t->tm_hour%=60;
    }
我感觉还是有问题,应该是>24,你看是不是,很高兴能为RTT出点力 哈哈 我准备好好研究一下RTT以后产品上用

ffxz 发表于 2010-7-29 12:25:34

yygymmq用的是哪类平台?目前来说,RT-Thread仅在GCC上,且不使用newlib的情况下才会使用minilibc。所以minilibc更新也比较少,检查得也比较少。这段应该是复制引起的典型错误,人力所限,minilibc还处于无人维护的阶段~~

yygymmq 发表于 2010-7-29 23:11:54

我是在KEIL下开发,最近由于用了KEIL的库,我觉的实现的好像有点问题,可是我又看不到KEIL的库,所以想到了看看RTT的库,就发现了这个问题,呵呵

yygymmq 发表于 2010-7-29 23:13:28

我有时间再检查一下其他的库吧,目前就看了一下time.c
页: [1]
查看完整版本: 关于minilibc中函数的几点疑问