打印

SWITCH语句仿真时为什么会出错?

[复制链接]
2517|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
微风|  楼主 | 2007-7-12 13:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在调程序,遇到SWITCH语句,用仿真器去调试。以下程序编译没问题,在ADS1.2、RVDS2.2、KEIL ARM3.05A、KEIL C51下仿真都会出错,唯有在ICCAVR 6.3编译后用AVRSTUDIO仿真是对的。难道D版的编译器有问题?
void Lcd_Init(unsigned char i );    
 
 main(void)    
{

        unsigned char i=5;
        Lcd_Init(i); 
         
        
         i=0x00;
         return 0;
}


void Lcd_Init(unsigned char i)
{    
    unsigned char cc;
    switch(i)
    {
    case 1:
      {
        //gg=(unsigned char (*)[20])aa+1;
        cc=9;
        break;
       }
    case 2:
       {
         //gg=(unsigned char (*)[20])aa;
         cc=9;
    
         break;
        }

    case 3:
        {
          //gg=(unsigned char (*)[20])aa;   
          cc=9;
          break;
        }
    case 4:
        {
          //gg=(unsigned char (*)[20])aa;
          cc=9;
          break;
        }
    case 5:
        {
          //gg=(unsigned char (*)[20])aa+2;
          cc=9;
          break;
        }
    default:
    break;
    }    
}

相关帖子

沙发
computer00| | 2007-7-12 14:53 | 只看该作者

瞎扯,怎么个错发? 估计是帮你把代码优化了,

你还咬吕洞兵,不识好人心...


很明显,每个cc=9都可以提取公因式,这样可以节省空间...光这里就可以优化

使用特权

评论回复
板凳
微风|  楼主 | 2007-7-12 14:59 | 只看该作者

不是这么回事,改成1、2、3、4、5也一样

用keil ARM 3.05A仿真的时候,先跳到CASE 5,执行完后跳到CASE 1的break那里去,然后才出来。ADS、RVDS、C51则乱跳了

使用特权

评论回复
地板
computer00| | 2007-7-12 15:19 | 只看该作者

没关系了,只要结果正确就行.

直接跳到case 5那里,明显是优化的结果,你可以看汇编出来的结果.

还可以看最终的执行结果。

使用特权

评论回复
5
微风|  楼主 | 2007-7-12 15:30 | 只看该作者

但是别的仿真根本连CASE里面的那些语句都不执行

圈圈同学要不要试一试

使用特权

评论回复
6
微风|  楼主 | 2007-7-12 15:31 | 只看该作者

甚至连CASE 5都跳不到

使用特权

评论回复
7
computer00| | 2007-7-12 15:36 | 只看该作者

你的cc后面用了没? 再将它赋给一个IO口试试?

如果你的cc后面根本都没用到,那么编译器就认为这个变量没用的,反正都没用,何苦给他赋值? 所以干脆将你的赋值语句给删了. 放心吧,通常编译器不会出现这么低级的错误的,它这样做,总有它的道理.

使用特权

评论回复
8
微风|  楼主 | 2007-7-12 16:02 | 只看该作者

试了一下C51果然是被优化掉了

以前用SWITCH的时候参数最后都用了,所以没什么问题。这次同事调程序出了这个问题,我试了发现果然跟他说的一样,看来还是程序写得少的缘故。
用一个时髦的词:倒塌了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

681

帖子

4

粉丝