使用局部变量遇到的怪现象
我在一个函数定义了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;
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”这个变量才正常。
}
本帖最后由 wear778899 于 2012-5-8 10:26 编辑
U8 Turn_Timer ;在函数调用时 申请空间 函数返回后释放空间 局部变量的生命周期只在子函数正在执行时
用static 修饰一下变量
static unsigned char i ; i 只在被声明的子函数内使用,函数返回后不被释放,并且存储空间不被其他函数覆盖 跟全局变量占用内存是一样的 只是方便管理
--------------------------
修改错别字 楼上正解 为什么另一个变量就可以正常使用,另一个在后面加一句又可以正常使用,这是为什么 明白了,Turn_Timer的值调用完后又被清零了,所以无法满足条件,但为什么加了Real_Speed00=Turn_Timer;就可以呢?难道这时它就不会被清零? 后面这个问题 就是编译器的问题了到底为什么要看编译后的汇编代码
估计Real_Speed00 变量应该是全局变量
我猜是 编译器优化掉Turn_Timer就是说实际上子函数里使用的变量就是Real_Speed00本身
Real_Speed00 的确是全局变量,可能是你说的情况,谢谢你。 我是来楼主的头像的{:lol:} szzyq 发表于 2012-5-8 10:35 static/image/common/back.gif
明白了,Turn_Timer的值调用完后又被清零了,所以无法满足条件,但为什么加了Real_Speed00=Turn_Timer;就可 ...
"明白了,Turn_Timer的值调用完后又被清零了,所以无法满足条件"
樓主,你這句解釋是否錯誤,Turn_Timer里的值被清0后,前面的Turn_Timer++應該是重新再計數,所以條件應該是成立的.
页:
[1]