搜索
bottom↓
回复: 16

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

[复制链接]

出0入0汤圆

发表于 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  见鬼了,,这么多年,第一次遇到。

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2015-1-16 11:15:53 | 显示全部楼层
请上传较完整程序,注意形参与实参

出0入0汤圆

发表于 2015-1-16 11:34:19 | 显示全部楼层
我也觉得参数传递问题更多些。实在找不出来你可以在调试状态下看汇编语句

出0入0汤圆

发表于 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

编辑原因:少写一行语句

出0入0汤圆

发表于 2015-1-16 11:50:50 来自手机 | 显示全部楼层
看看编译后的汇编。
实在不行手动改成汇编即可

出0入0汤圆

发表于 2015-1-16 11:50:56 | 显示全部楼层

用volatile修饰没?

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

出0入0汤圆

发表于 2015-1-16 12:13:36 | 显示全部楼层
tam2907 发表于 2015-1-16 11:15
请上传较完整程序,注意形参与实参

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

出0入0汤圆

发表于 2015-1-16 12:17:05 | 显示全部楼层
楼主不贴真实代码,有啥问题也看不出来

出0入0汤圆

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

出0入0汤圆

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

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

出0入0汤圆

发表于 2015-1-16 12:26:05 | 显示全部楼层
A1,A2 全局变量? 上完整代码吧

出0入0汤圆

发表于 2015-1-16 14:04:27 | 显示全部楼层
我的mdk511,也出过类似问题;
if (a <=2)
{
...
}
if 语句判断执行有误,明明a=5,还是进了if 内部。

出0入0汤圆

发表于 2015-1-19 18:32:09 | 显示全部楼层
volatile吧???

出0入8汤圆

发表于 2015-1-19 18:58:13 | 显示全部楼层
估计 最大的可能就是没有加 volatile。

出0入0汤圆

发表于 2015-1-19 19:19:15 来自手机 | 显示全部楼层
我用ICCAVR经常出鬼

出0入0汤圆

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

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

出0入0汤圆

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

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

我能说这样的例子出现过无数次了吗?总有人怀疑编译器,怀疑MCU,就是不怀疑自己。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-25 11:38

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

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