遇到一个编译器见鬼的事情。
A1=0;为0A2=0;为0
程序1:
VOID FUN(A1,A2)
{
//test1=A1;
//test2=A2;
if((A1>0)||(A2==1))
{
test1=2;
test2=3;
}
}
运行结果 是进入了IF里面,test1=2; test2=3;
程序2:
VOID FUN(A1,A2)
{
test1=A1;
test2=A2;
if((A1>0)||(A2==1))
{
test1=2;
test2=3;
}
}
运行结果 是么有进入了IF里面,test1=0; test2=0;
各位怎么看带 这个问题。如果条件判断之前插入一句任何语句,就能正常判断条件,如果判断之前注释掉语句,那么就判断错误,进入IF条件。。使用的是IAR6.2见鬼了,,这么多年,第一次遇到。
请上传较完整程序,注意形参与实参 我也觉得参数传递问题更多些。实在找不出来你可以在调试状态下看汇编语句 本帖最后由 huangxiaolpbany 于 2015-1-16 11:43 编辑
我也遇到编译器出轨的时候
浮点数不会判断大小
我的想法是设备向右移动,坐标值(x_value)到设定位置(x_temp)距离小于1mm以后,跳出循环
这样就不能判断
do
{
t2_flag=0;
while(!t2_flag);//cycle time 20ms
MoveXPlus();
if(status!=21)
{
goto jumpexit;
}
x_value=get_pulse(1)*x_scale;
y_value=get_pulse(2)*y_scale;
ad_value=0;
if(x_value<=x_temp)
{
move_error=x_temp-x_value;
pos_reach=0;
}
else
{
move_error=x_value-x_temp;
pos_reach=1;
}
refresh();
}
while((move_error>1)&&(pos_reach==0));
改成这样就行
do
{
t2_flag=0;
while(!t2_flag);//cycle time 20ms
MoveXPlus();
if(status!=21)
{
goto jumpexit;
}
x_value=get_pulse(1)*x_scale;
y_value=get_pulse(2)*y_scale;
ad_value=0;
refresh();
}
while(x_value<x_temp);
只是不能判断距离差值了
编译器是ICCAVR 7.22
编辑原因:少写一行语句 看看编译后的汇编。
实在不行手动改成汇编即可
用volatile修饰没?
编译器单步运行,看变量值对没。 tam2907 发表于 2015-1-16 11:15
请上传较完整程序,注意形参与实参
同意2楼,看看调用部分,楼主现在只展现了定义部分。 楼主不贴真实代码,有啥问题也看不出来 注意test1和test2的作用范围,是函数内的局部变量,还是.c文件内的局部变量。 sbusr 发表于 2015-1-16 12:21
注意test1和test2的作用范围,是函数内的局部变量,还是.c文件内的局部变量。 ...
test1,2 是定义的全局变量,我方便显示出来,所以用LCD就跟踪到了这一步,就发现问题,,,, A1,A2 全局变量? 上完整代码吧 我的mdk511,也出过类似问题;
if (a <=2)
{
...
}
if 语句判断执行有误,明明a=5,还是进了if 内部。 volatile吧??? 估计 最大的可能就是没有加 volatile。 我用ICCAVR经常出鬼 不好意思,可以结贴了,发现原因了,由于运行的时候是A是一个全局变量,导致在系统么有准备好之前,就把A的值确定了,但是系统稳定之后,A的值又重新赋予,从而导致怎么也查不出来,后来加了一个条件就好了。
事实证明,遇到这类问题,还是应该先怀疑自己哪里出错了,一般来说只要运行的程序么有问题,编译器出问题的几率非常小。 xly2014 发表于 2015-1-21 11:54
不好意思,可以结贴了,发现原因了,由于运行的时候是A是一个全局变量,导致在系统么有准备好之前,就把A的 ...
多么深的领悟......
我能说这样的例子出现过无数次了吗?总有人怀疑编译器,怀疑MCU,就是不怀疑自己。
页:
[1]