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

[复制链接]
3363|7
 楼主| 微风 发表于 2007-7-12 13:54 | 显示全部楼层 |阅读模式
最近在调程序,遇到SWITCH语句,用仿真器去调试。以下程序编译没问题,在ADS1.2、RVDS2.2、KEIL&nbsp;ARM3.05A、KEIL&nbsp;C51下仿真都会出错,唯有在ICCAVR&nbsp;6.3编译后用AVRSTUDIO仿真是对的。难道D版的编译器有问题?<br />void&nbsp;Lcd_Init(unsigned&nbsp;char&nbsp;i&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;<br />&nbsp;main(void)&nbsp;&nbsp;&nbsp;&nbsp;<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i=5;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Lcd_Init(i);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br /><br />void&nbsp;Lcd_Init(unsigned&nbsp;char&nbsp;i)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;cc;<br />&nbsp;&nbsp;&nbsp;&nbsp;switch(i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//gg=(unsigned&nbsp;char&nbsp;(*)[20])aa+1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc=9;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;2:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//gg=(unsigned&nbsp;char&nbsp;(*)[20])aa;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc=9;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;3:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//gg=(unsigned&nbsp;char&nbsp;(*)[20])aa;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc=9;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;4:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//gg=(unsigned&nbsp;char&nbsp;(*)[20])aa;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc=9;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;5:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//gg=(unsigned&nbsp;char&nbsp;(*)[20])aa+2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cc=9;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;default:<br />&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />}
computer00 发表于 2007-7-12 14:53 | 显示全部楼层

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

你还咬吕洞兵,不识好人心...<br /><br /><br />很明显,每个cc=9都可以提取公因式,这样可以节省空间...光这里就可以优化
 楼主| 微风 发表于 2007-7-12 14:59 | 显示全部楼层

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

用keil&nbsp;ARM&nbsp;3.05A仿真的时候,先跳到CASE&nbsp;5,执行完后跳到CASE&nbsp;1的break那里去,然后才出来。ADS、RVDS、C51则乱跳了
computer00 发表于 2007-7-12 15:19 | 显示全部楼层

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

直接跳到case&nbsp;5那里,明显是优化的结果,你可以看汇编出来的结果.<br /><br />还可以看最终的执行结果。
 楼主| 微风 发表于 2007-7-12 15:30 | 显示全部楼层

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

圈圈同学要不要试一试
 楼主| 微风 发表于 2007-7-12 15:31 | 显示全部楼层

甚至连CASE 5都跳不到

  
computer00 发表于 2007-7-12 15:36 | 显示全部楼层

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

如果你的cc后面根本都没用到,那么编译器就认为这个变量没用的,反正都没用,何苦给他赋值?&nbsp;所以干脆将你的赋值语句给删了.&nbsp;放心吧,通常编译器不会出现这么低级的错误的,它这样做,总有它的道理.
 楼主| 微风 发表于 2007-7-12 16:02 | 显示全部楼层

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

以前用SWITCH的时候参数最后都用了,所以没什么问题。这次同事调程序出了这个问题,我试了发现果然跟他说的一样,看来还是程序写得少的缘故。<br />用一个时髦的词:倒塌了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

681

帖子

4

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