搜索
bottom↓
回复: 8

使用局部变量遇到的怪现象

[复制链接]

出0入0汤圆

发表于 2012-5-8 10:15:13 | 显示全部楼层 |阅读模式
我在一个函数定义了2个局部变量,这2个变量只在下面的语句应用,其中有“temp”这个变量正常,"Turn_Timer"这个变量不正常,没加最后一句之前始终无法进入里面对“Turn_Count”进行累加,加了“ Real_Speed00=Turn_Timer;”这后就正常了,或者将"Turn_Timer"设为全局变量就正常了,请问这是怎么回事?
void send_real_speed(void)    //这个函数是1毫秒调用一次的
{
    u8 temp,Turn_Timer;
   Turn_Timer++;
   if(Turn_Timer>Set_Turn_Period)    //Set_Turn_Period的值为30-100之间
  {
        Turn_Timer=0;                         //始终无法满足条件进入这里
        Turn_Count++;
   }
   if(Left_Speed_Band>0)temp=Display_Set_Speed[Left_Speed_Band-3];
   if(Left_Speed_Band<0)temp=Display_Set_Speed[-Left_Speed_Band-3];
   if(Left_Speed_Band==0)temp=0;
   Real_Speed=temp/10;
   Real_Speed0=temp%10;
   Real_Speed00=Turn_Timer;     //只有加入这句“Turn_Timer”这个变量才正常。
}  

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-5-8 10:25:24 | 显示全部楼层
本帖最后由 wear778899 于 2012-5-8 10:26 编辑

U8 Turn_Timer ;  在函数调用时 申请空间   函数返回后  释放空间    局部变量的生命周期只在子函数正在执行时  
用static 修饰一下变量

static unsigned char i ;    i 只在被声明的子函数内使用,函数返回后不被释放,并且存储空间不被其他函数覆盖   跟全局变量占用内存是一样的   只是方便管理

--------------------------
修改错别字

出0入0汤圆

发表于 2012-5-8 10:30:17 | 显示全部楼层
楼上正解

出0入0汤圆

 楼主| 发表于 2012-5-8 10:30:38 | 显示全部楼层
为什么另一个变量就可以正常使用,另一个在后面加一句又可以正常使用,这是为什么

出0入0汤圆

 楼主| 发表于 2012-5-8 10:35:58 | 显示全部楼层
明白了,Turn_Timer的值调用完后又被清零了,所以无法满足条件,但为什么加了Real_Speed00=Turn_Timer;就可以呢?难道这时它就不会被清零?

出0入0汤圆

发表于 2012-5-8 10:38:56 | 显示全部楼层
后面这个问题   就是编译器的问题了  到底为什么要看编译后的汇编代码   

估计Real_Speed00 变量应该是  全局变量   

我猜是 编译器优化掉Turn_Timer  就是说实际上子函数里使用的变量就是Real_Speed00本身

出0入0汤圆

 楼主| 发表于 2012-5-8 10:46:27 | 显示全部楼层
Real_Speed00 的确是全局变量,可能是你说的情况,谢谢你。

出0入0汤圆

发表于 2012-5-8 11:26:47 | 显示全部楼层
我是来楼主的头像的

出0入0汤圆

发表于 2012-5-8 11:46:14 | 显示全部楼层
szzyq 发表于 2012-5-8 10:35
明白了,Turn_Timer的值调用完后又被清零了,所以无法满足条件,但为什么加了Real_Speed00=Turn_Timer;就可 ...

"明白了,Turn_Timer的值调用完后又被清零了,所以无法满足条件"
樓主,你這句解釋是否錯誤,Turn_Timer里的值被清0后,前面的Turn_Timer++應該是重新再計數,所以條件應該是成立的.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 02:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表