xly2014 发表于 2015-1-16 11:04:11

遇到一个编译器见鬼的事情。

   A1=0;为0
   A2=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见鬼了,,这么多年,第一次遇到。

tam2907 发表于 2015-1-16 11:15:53

请上传较完整程序,注意形参与实参

haibaogk 发表于 2015-1-16 11:34:19

我也觉得参数传递问题更多些。实在找不出来你可以在调试状态下看汇编语句

huangxiaolpbany 发表于 2015-1-16 11:41:51

本帖最后由 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

编辑原因:少写一行语句

hubeilcsun3 发表于 2015-1-16 11:50:50

看看编译后的汇编。
实在不行手动改成汇编即可

穷折腾 发表于 2015-1-16 11:50:56


用volatile修饰没?

编译器单步运行,看变量值对没。

dengxm2009 发表于 2015-1-16 12:13:36

tam2907 发表于 2015-1-16 11:15
请上传较完整程序,注意形参与实参

同意2楼,看看调用部分,楼主现在只展现了定义部分。

专注XXOO三十年 发表于 2015-1-16 12:17:05

楼主不贴真实代码,有啥问题也看不出来

sbusr 发表于 2015-1-16 12:21:25

注意test1和test2的作用范围,是函数内的局部变量,还是.c文件内的局部变量。

xly2014 发表于 2015-1-16 12:25:01

sbusr 发表于 2015-1-16 12:21
注意test1和test2的作用范围,是函数内的局部变量,还是.c文件内的局部变量。 ...

test1,2 是定义的全局变量,我方便显示出来,所以用LCD就跟踪到了这一步,就发现问题,,,,

powerk6 发表于 2015-1-16 12:26:05

A1,A2 全局变量? 上完整代码吧

jiki119 发表于 2015-1-16 14:04:27

我的mdk511,也出过类似问题;
if (a <=2)
{
...
}
if 语句判断执行有误,明明a=5,还是进了if 内部。

magicoe 发表于 2015-1-19 18:32:09

volatile吧???

kebaojun305 发表于 2015-1-19 18:58:13

估计 最大的可能就是没有加 volatile。

mingxin 发表于 2015-1-19 19:19:15

我用ICCAVR经常出鬼

xly2014 发表于 2015-1-21 11:54:02

不好意思,可以结贴了,发现原因了,由于运行的时候是A是一个全局变量,导致在系统么有准备好之前,就把A的值确定了,但是系统稳定之后,A的值又重新赋予,从而导致怎么也查不出来,后来加了一个条件就好了。

事实证明,遇到这类问题,还是应该先怀疑自己哪里出错了,一般来说只要运行的程序么有问题,编译器出问题的几率非常小。

steaven2000 发表于 2015-1-22 13:35:03

xly2014 发表于 2015-1-21 11:54
不好意思,可以结贴了,发现原因了,由于运行的时候是A是一个全局变量,导致在系统么有准备好之前,就把A的 ...

多么深的领悟......

我能说这样的例子出现过无数次了吗?总有人怀疑编译器,怀疑MCU,就是不怀疑自己。
页: [1]
查看完整版本: 遇到一个编译器见鬼的事情。