Keil 太智能化了,是好事还是坏事????


如下代码:

CODE:


uchar keyGet(){  
uchar k;
P1|=0x07;
k=P1;
k>>=1;    //此处指令,Keil判断变量k没有实际意义,没有编译,看汇编代码就知道了.
if(!CY) return 0;//右移时,最低位移入了CY,由于上面行没被编译,这行就失去了意义!
k>>=1;
if(!CY) return 1;
k>>=1;
if(!CY) return 2;
return 0xFF;
}


右移指令没编译.JPG


由于没有编译k>>=1;,造成其下一行:if(!CY)产生错误结果.朋友们要小心啊!!!!!!!!!!!!!

[ 本帖最后由 ybzjllj 于 2008-7-16 12:49 编辑 ]

我也来说两句 查看全部回复

最新回复

  • ybzjllj (2008-7-16 12:44:31)

    如果把变量k定义成全局变量,编译时,右移指令就不会被忽略了.

    CODE:


    uchar k;  //在函数外声明
    uchar keyGet(){  
      P1|=0x07;
    k=P1;
    k>>=1;   //此处就要编译了
    if(!CY) return 0;
    k>>=1;
    if(!CY) return 1;
    k>>=1;
    if(!CY) return 2;
    return 0xFF;
    }
    看汇编代码如下:


    右移指令编译了.JPG

  • tssing (2008-7-16 12:45:13)

    怎么说呢,,怎么说呢,,怎么说呢,,怎么说呢,,怎么说呢,,
  • ybzjllj (2008-7-16 12:47:13)

    我想当然地,以为Keil在编译时,会执行所有的C代码,造成程序BUG,害我查了N久,都没找到问题!!!!!!!!!!!!!

    各位,遇类似情况要小心!!!!!!!!!!!!!!!!!!!
  • fz5098 (2008-7-16 13:01:49)

    怎么说呢,,怎么说呢,,怎么说呢,,怎么说呢,,怎么说呢,,
  • fz5098 (2008-7-16 13:02:37)

  • ybzjllj (2008-7-16 16:45:26)

    你们灌水也灌得太马虎了吧?                                                                                 .
  • znz23456 (2008-7-16 17:05:00)

    好事!!ㄐㄐㄐㄐㄐㄐㄐㄐㄐㄐㄐㄐㄐㄐ好事!!ㄐㄐㄐㄐㄐㄐㄐㄐㄐㄐㄐㄐㄐㄐ
  • hgjinwei (2008-7-16 18:30:44)

    用汇编写吧.  啊门.........................
  • chasdfgh (2008-7-16 19:01:33)

    没钱看看哦,谢谢楼主哦,谢谢了啊,太好了看看啊,呵呵。谢谢了啊。
  • leotron (2008-7-16 21:30:35)

    不是太清楚。呵。。。。。。。。。。。。。。。。。。。。。。
  • ybzjllj (2008-7-17 10:29:01)

    看来是我的编程方法不正确,没有多少人响应?

    来回复的多数都是为了硬币啊?
  • yang007 (2008-7-17 14:21:56)

    确实。。在写大型程序,如果有这样的问题麻烦就大了。。
  • projectbox (2008-7-17 14:53:02)

    优化级别调低些应该就不会出现这个问题了,你可以试试
  • hotrainbow (2008-7-17 16:36:14)

    同意楼上的,优化级别设置低点,不过我还是没明白为什么声明为全局变量,就能编译了??呵呵
  • guidanghu520 (2008-7-17 17:25:12)

    看来用这个东西要多加小心啊!!!!!!!!!!!!!!11
  • shiwen1982 (2008-7-17 23:06:02)

    没钱看看哦,谢谢楼主哦,谢谢了啊,太好了看看啊,呵呵。谢谢了啊。
  • xieyi (2008-7-18 08:46:03)

    QUOTE:

    原帖由 ybzjllj 于 2008-7-16 12:44 发表
    如果把变量k定义成全局变量,编译时,右移指令就不会被忽略了.

    uchar k;  //在函数外声明
    uchar keyGet(){  
      P1|=0x07;
    k=P1;
    k>>=1;   //此处就要编译了
    if(!CY) return 0;
    k>>=1;
    if(!CY) return 1;
    k>>=1 ...
    没有真正明白楼主程序的意图,这个问题我的理解是:我觉得最主要的原因是这样的移位好像是不会影响 CY ,所以编译器在编译的时候把此句忽略了(节省代码空间,可以试一下k<<=1;就可以编译了),我们在编程的时候应该要注意到语句是否有意义。当然也可以把 k 声明为易变的 (" volatile ")(不过这样做好像没什么意义),对比以下代码。

    CODE:


    uint8 keyGet()
    {  
    uint8 k;
    P1|=0x07;
    k=P1;
    k<<=1;    //影响了CY,所以此句编译了
    if(!CY) return 0;
    k>>=1; //使用到了局部变量k,所以也编译了
    if(k!=0x02) return 1;
    k>>=1;    //未影响k,语句被忽略
    if(!CY) return 2;
    return 0xFF;
    }
    [ 本帖最后由 xieyi 于 2008-7-18 08:54 编辑 ]
  • oldkey (2008-7-18 09:24:14)

    不是KEIL太智能了,而是他太笨了。她无法理解你程序中隐含的意思,因此,它只能是根据自己的理解,该有用的留下,没用的干掉而已。
    另外,啰嗦一句:汇编时期的技巧,不是C时期的优势,而是绊脚石。。。
  • hxh1985 (2008-7-18 15:33:29)

    对这个问题不是很清楚,
    智能了好啥,更容易编写程序 查找错误
  • 爆裂 (2008-7-19 17:33:26)

    按道理不应该有这样的编译错误,可能是优化的判断太苛刻。