加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

stm32 变量声明的一些问题

(2012-07-31 10:09:51)
标签:

杂谈

最近的程序有点怪异。

一般情况下就是可以的。

就是有时候在函数嵌套太多的情况下,这个函数就不能用了。更准确的说里面的变量总是出错了。

void Time_Display(u32 TimeVar)
{
#if 1
  s32 Num4Y,NumY, OffSec, Off4Y = 0;
  u32 i;
  s32 NumDay; //OffDay;

  //放到里面,因为如果在外面,全局变量太多的情况下容易出错。
  s32 Year_Secs_Accu[5]={0,
                      31622400,
                      63158400,
                      94694400,
                      126230400};

s32 Month_Secs_Accu_C[13] = { 0,
                            2678400,
                            5097600,
                            7776000,
                            10368000,
                            13046400,
                            15638400,
                            18316800,
                            20995200,
                            23587200,
                            26265600,
                            28857600,
                            31536000};
s32 Month_Secs_Accu_L[13] = {0,
                            2678400,
                            5184000,
                            7862400, 
                            10454400,
                            13132800,
                            15724800,
                            18403200,
                            21081600,
                            23673600,
                            26352000,
                            28944000,
                            31622400};

       
#endif

#if 1
  {
    Num4Y = TimeVar/SecsPerFourYear;
    OffSec = TimeVar%SecsPerFourYear;

    i=1;
    while(OffSec > Year_Secs_Accu[i++])
      Off4Y++;
 
   
    NumY = Num4Y*4 + Off4Y;
     
    TY = 2000+NumY; 

   
    OffSec = OffSec - Year_Secs_Accu[i-2];
   
   
    i=0;
    if(TY%4)
    {// common year
      while(OffSec > Month_Secs_Accu_C[i++]);
      TM = i-1;
      OffSec = OffSec - Month_Secs_Accu_C[i-2];
    }
    else
    {// leap year
      while(OffSec > Month_Secs_Accu_L[i++]);
      TM = i-1;
      OffSec = OffSec - Month_Secs_Accu_L[i-2];
    }
   
   
    NumDay = OffSec/SecsPerDay;
    OffSec = OffSec%SecsPerDay;
    TD = NumDay+1;

     
  THH = OffSec/3600;
 
  TMM = (OffSec % 3600)/60;
 
  TSS = (OffSec % 3600)% 60;
  }
#endif

//   printf("TY=%#x\n",&TY);
//   printf("TM=%#x\n",&TM);
//   printf("TD=%#x\n",&TD);
//   printf("THH=%#x\n",&THH);
//   printf("TMM=%#x\n",&TMM);
//   printf("TSS=%#x\n",&TSS);
//TY=2012,TM=7,TD=31,THH=8,TMM=34,TSS=16;

  printf("Date: %0.4d-%0.2d-%0.2d Time: %0.2d:%0.2d:%0.2d\r",TY, TM, TD,THH, TMM, TSS);
}

 

这是一个很普通的万年历程序。

  //放到里面,因为如果在外面,全局变量太多的情况下容易出错。
  s32 Year_Secs_Accu[5]={0,
                      31622400,
                      63158400,
                      94694400,
                      126230400};

s32 Month_Secs_Accu_C[13] = { 0,
                            2678400,
                            5097600,
                            7776000,
                            10368000,
                            13046400,
                            15638400,
                            18316800,
                            20995200,
                            23587200,
                            26265600,
                            28857600,
                            31536000};
s32 Month_Secs_Accu_L[13] = {0,
                            2678400,
                            5184000,
                            7862400, 
                            10454400,
                            13132800,
                            15724800,
                            18403200,
                            21081600,
                            23673600,
                            26352000,
                            28944000,
                            31622400};

这个是变量定义。

刚开始是在外面定义,但是一旦函数嵌套太多的话,这个函数中的变量就会出错。每次都不是数组中的内容。

于是我把他定义成局部变量,这样就没问题了。

可能是嵌套太多里面的地址发生了一些外面意想不到的变化。导致把不该改变的地址内容给改变了。

非常要注意的一点是,这个定义不能在主函数文件之外的其他文件中定义,然后再在这个函数中extern一下这样也不行。

在主函数的文件下定义,再在这个函数中extern这样就都没问题。

所以大虾门总是让我们全局变量都在主函数中定义是非常正确的。确实会减少一些不必要的麻烦。或者直接定义成局部变量也是可以的。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有