Keil51仿真的问题

[复制链接]
 楼主| deng_1976 发表于 2007-12-2 17:02 | 显示全部楼层 |阅读模式
见图片,在KEIL里面,程序中有几句程序不能执行,是什么问题,高手请指点!见图。白色旁边的语句不能执行:      Num3[2]=0xff;
      Num3[1]=0xff;
      Num3[0]=0xff;
恩保 发表于 2007-12-2 19:08 | 显示全部楼层

把所有的程序发过来看看

把整个程序搞过来看看啦。为什么m==5的时候从num3[4]开始,而m==4的时候也是从num3[4]开始。是不是分号出了问题
computer00 发表于 2007-12-2 19:25 | 显示全部楼层

估计是那几个变量后面都没用到,所以编译器认为你这语句

所以就将这些语句给删除了...也就是说被优化掉了....
 楼主| deng_1976 发表于 2007-12-2 21:51 | 显示全部楼层

谢谢上面2位的回复。

部分程序如下,想了半天,后来我把ELSE删除就ok了。 想不通为什么这样就不通,估计可能是优化的问题,但优化不至于不管IF-ELSE吧。。。。

  if(m==5)
   {
      Num3[4]=0xff;
      Num3[3]=0xff;
      Num3[2]=0xff;
      Num3[1]=0xff;
      Num3[0]=0xff;
   }

   if(m==4)
   {
      Num3[4]=0xff;
      Num3[3]=0xff;
      Num3[2]=0xff;
      Num3[1]=0xff;
      if(n==0) Num3[0]=0x00;
      if(n==1) Num3[0]=0x80;
      if(n==2) Num3[0]=0xc0;
      if(n==3) Num3[0]=0xe0;
      if(n==4) Num3[0]=0xf0;
      if(n==5) Num3[0]=0xf8;
      if(n==6) Num3[0]=0xfc;
      if(n==7) Num3[0]=0xfe;
   }
computer00 发表于 2007-12-2 22:03 | 显示全部楼层

优化的事情可难说了,只要是无用的语句,编译器通常会帮

mapleyang 发表于 2007-12-2 22:39 | 显示全部楼层

还有一种可能

你的这两个case里面给这几个元素赋值都是一样的,编译器认为不管哪种情况都执行同样的结果,就给优化了
xwj 发表于 2007-12-2 22:47 | 显示全部楼层

还有个可能

合并到其他地方去了,你先跟一遍看看
 楼主| deng_1976 发表于 2007-12-3 08:44 | 显示全部楼层

中间分割条白色区域所对应地方是执行不到的

中间分割条白色区域所对应地方是执行不到的。一点启动调试的时候,这些区域都能自动分出来
computer00 发表于 2007-12-3 09:45 | 显示全部楼层

不是执行不到,而是在编译的时候,根本就已经将这些语句

不信你自己看看编译后的汇编。
古道热肠 发表于 2007-12-3 09:55 | 显示全部楼层

优化的可能性最大,关注运行结果

只要结果是对的,可以认为是优化的缘固,可将优化等级设定为2级试试。
ayb_ice 发表于 2007-12-3 09:55 | 显示全部楼层

这是优化的问题,很正常

和其它的公共部分合并了,所以在其它地方执行了,不影响功能的
 楼主| deng_1976 发表于 2007-12-3 09:58 | 显示全部楼层

呵呵。

computer00说的对,调试的时候我看过汇编的地方,执行不到的地方语句在汇编里面压根就没有了,估计被优化掉了。。。。
 楼主| deng_1976 发表于 2007-12-3 10:00 | 显示全部楼层

11楼: 这是优化的问题,很正常

11楼的兄弟,这个影响功能的,结果是执行到了不该执行的地方去了。
 
    
computer00 发表于 2007-12-3 10:04 | 显示全部楼层

虽然执行到了不该执行到的地方去了,但是结果还是可能是

不一定要按照你的流程执行才是正确的,编译器改个方法执行,换个地方执行,只要结果是正确的,就算OK。
 楼主| deng_1976 发表于 2007-12-3 10:30 | 显示全部楼层

在这里,结果不对,所以我只好将ELSE删除了。

在这里,结果不对,所以我只好将ELSE删除了,并联几个IF语句。
ayb_ice 发表于 2007-12-3 11:42 | 显示全部楼层

我用KEIL也有好几年了,还没有发现什么优化错误

mapleyang 发表于 2007-12-3 13:27 | 显示全部楼层

re

楼主用个switch试试?
按理keil不会那么弱的,因为优化带来功能的问题。把代码再贴完整一些看看,看你的代码也没啥好保密的。
 楼主| deng_1976 发表于 2007-12-3 13:39 | 显示全部楼层

LS的,我准备晚上回家弄个SWITCH-CASE看看。

里面的代码就是这样,不知道是否有问题。后面的IF前面加ELSE就会那样。

   Num4[0]=Data/10000;
   Num4[1]=(Data-Num4[0]*10000)/1000;
   Num4[2]=(Data-Num4[0]*10000-Num4[1]*1000)/100;
   Num4[3]=(Data-Num4[0]*10000-Num4[1]*1000-Num4[2]*100)/10;
   Num4[4]=Data-Num4[0]*10000-Num4[1]*1000-Num4[2]*100-Num4[3]*10;

   TankHeight=Tank_Height[0]*100+Tank_Height[1];
   TankHeight=5000;
   k=(int)(Data*40.0/TankHeight+0.5);
   if(k>40) k=40;
   m=k/8;
   n=k%8;

   if(m==5)
   {
      Num3[4]=0xff;
      Num3[3]=0xff;
      Num3[2]=0xff;
      Num3[1]=0xff;
      Num3[0]=0xff;
   }

   if(m==4)
   {
      Num3[4]=0xff;
      Num3[3]=0xff;
      Num3[2]=0xff;
      Num3[1]=0xff;
      if(n==0) Num3[0]=0x00;
      if(n==1) Num3[0]=0x80;
      if(n==2) Num3[0]=0xc0;
      if(n==3) Num3[0]=0xe0;
      if(n==4) Num3[0]=0xf0;
      if(n==5) Num3[0]=0xf8;
      if(n==6) Num3[0]=0xfc;
      if(n==7) Num3[0]=0xfe;
   }

   if(m==3)
   {
      Num3[4]=0xff;
      Num3[3]=0xff;
      Num3[2]=0xff;
      if(n==0) Num3[1]=0x00;
      if(n==1) Num3[1]=0x80;
      if(n==2) Num3[1]=0xc0;
      if(n==3) Num3[1]=0xe0;
      if(n==4) Num3[1]=0xf0;
      if(n==5) Num3[1]=0xf8;
      if(n==6) Num3[1]=0xfc;
      if(n==7) Num3[1]=0xfe;
      Num3[0]=0x00;
   }

   if(m==2)
   {
      Num3[4]=0xff;
      Num3[3]=0xff;
      if(n==0) Num3[2]=0x00;
      if(n==1) Num3[2]=0x80;
      if(n==2) Num3[2]=0xc0;
      if(n==3) Num3[2]=0xe0;
      if(n==4) Num3[2]=0xf0;
      if(n==5) Num3[2]=0xf8;
      if(n==6) Num3[2]=0xfc;
      if(n==7) Num3[2]=0xfe;
      Num3[1]=0x00;
      Num3[0]=0x00;
   }

   if(m==1)
   {
      Num3[4]=0xff;
      if(n==0) Num3[3]=0x00;
      if(n==1) Num3[3]=0x80;
      if(n==2) Num3[3]=0xc0;
      if(n==3) Num3[3]=0xe0;
      if(n==4) Num3[3]=0xf0;
      if(n==5) Num3[3]=0xf8;
      if(n==6) Num3[3]=0xfc;
      if(n==7) Num3[3]=0xfe;
      Num3[2]=0x00;
      Num3[1]=0x00;
      Num3[0]=0x00;
   }

   if(m==0)
   {
      if(n==0) Num3[4]=0x00;
      if(n==1) Num3[4]=0x80;
      if(n==2) Num3[4]=0xc0;
      if(n==3) Num3[4]=0xe0;
      if(n==4) Num3[4]=0xf0;
      if(n==5) Num3[4]=0xf8;
      if(n==6) Num3[4]=0xfc;
      if(n==7) Num3[4]=0xfe;
      Num3[3]=0x00;
      Num3[2]=0x00;
      Num3[1]=0x00;
      Num3[0]=0x00;
   }
dld2 发表于 2007-12-3 14:43 | 显示全部楼层

把楼主的程序改简单些

int i;
for (i = 0; i < 5; i++)
{
    if (i < (4 - m))
        Num3 = 0x00;
    else if (i == (4 - m))
        Num3 = 0xff << (8 - n);
    else
        Num3 = 0xff;
}
xwj 发表于 2007-12-3 14:55 | 显示全部楼层

唉,这程序写得...

要是按行数算钱或大小那就发了...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

45

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部