打印

关于PICC V9.xx编译器的不吐不快

[复制链接]
6154|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ailingg|  楼主 | 2012-11-15 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ailingg 于 2012-11-15 22:58 编辑

PICC V8.05编译运行正常的程序,用PICC 9.83怎么修改都不能正常运行。
关于PICC V9.83编译器,是语法检查严格还是BUG?问题如下:
1.“\”转义字符
          if(KeyAge<1)                  //如果按键一直按下,则键盘扫描函数里将使KeyAge增加到>=1,\
               flag_beep=SIGNAL;     //按键释放后KeyAge被清零
           break;
      case 0x42:                         // Decrease
      就因为注释行里有一个“\”转义字符,编译器就跳过break,这个问题我查了一整天。这难道是所谓的严格语法检查?明明就是BUG。
      ICC V9.83里倒是提到‘\’转义符的使用,但注释都分不清怎么也说不过去。
2.条件与
       如  if((flag_Setting==SealingSetting)&&((*select_ptr)<35))
       这条语句是得不到正确结果的,只能写成如下嵌套格式方能得到正确结果。
         if(flag_Setting==SealingSetting)
         {
              if(*select_ptr<35)
              {
                  ;
              }
         }
        条件或‘||’应该存在相同的问题。PICC V9.83使用手册里也找不到相关的变更说明。
3. 变量观察窗口
      无法显示指针指向的内容,定义指向数据存储器的指针指向对象时需在前面加数据类型修饰符才能正确显示结果,但编译时却警告语法不正确。


真不知道8.05版用的很好为什么最新版本却有这么多问题,是因为用盗版的人多所以很随意吗?真不知道还存在其他什么样的致命问题,让人用起来提心吊胆。
沙发
与时俱进| | 2012-11-15 22:12 | 只看该作者
break干嘛用在IF后面?貌似用在case后面,是不是要用大括号啊?

使用特权

评论回复
板凳
与时俱进| | 2012-11-15 22:16 | 只看该作者
还有,同样的编译环境,你可以把device改成旧的器件,用软件模拟运行,试试看,说不定
if((flag_Setting==SealingSetting)&&((*select_ptr)<35))    可以正确执行,而用新器件,就运行不正常。我发现存在这种情况。

使用特权

评论回复
地板
ailingg|  楼主 | 2012-11-15 22:42 | 只看该作者
本帖最后由 ailingg 于 2012-11-15 23:03 编辑

2# 与时俱进

break是对应上一个case的,汇编后的代码是return,这里只针对问题,所以省略了前面的代码。不用大括号,只要将注释行里的‘\’转义符去掉就好了,所以说这是bug。

使用特权

评论回复
5
ailingg|  楼主 | 2012-11-15 22:47 | 只看该作者
3# 与时俱进

我这个程序用的是老的器件,是16f73,无论怎么修改变量类型及限定修饰都得不到正确的结果,取消编译优化也无济于事。之所以用新的编译器一是因为win7系统用不了8.05,二是因为后续会用到新器件。

使用特权

评论回复
6
yewuyi| | 2012-11-16 08:58 | 只看该作者
1、如你这样出现\,编译的时候该行会报错,但一般不会为你所说的直接跳过不编译这一行,编译时发现报错时,双击该错误定位到该行后修改一下就可以了。
2、编辑代码要形成良好的习惯,无关的字符不要随意的敲入代码或者代码注释中,即使编译没问题,也容易给维护和阅读制造障碍
3、&&和||的问题从未发现,我也大量使用这两个运算符,没有发现什么问题。
我从我的代码中摘录的一段如下:if(ScoolErr||SdefErr||ScondErr||CondOverTempStart||OverTempDisp||DoorOpen||(!TestTimeLed()))
4、变量观察窗口:这个可和PICC没有关系,这是MPLAB的操作,不要挂在PICC的头上啊。
无法显示指针指向的内容,定义指向数据存储器的指针指向对象时需在前面加数据类型修饰符才能正确显示结果,但编译时却警告语法不正确。
这可能是你定义的指针变量和指向的实际变量之间存在隐含的强制类型转换造成的,如果是这样会出现编译警告,但编译器会按照自己的规则强制类型转换,没有办法,只能你修改自己的代码,依靠编译器隐含规则进行类型转换本身就不是什么好办法。

使用特权

评论回复
7
ailingg|  楼主 | 2012-11-16 12:37 | 只看该作者
本帖最后由 ailingg 于 2012-11-16 12:51 编辑

6# yewuyi

   谢谢专家回答。对于注释行里的‘\’9.8X版一律不报错,调试的时候,相似的代码连续减功能正常,连续加无法实现,所以花了一整天的时间才发现是注释行里的‘\’使代码跳过了break所致。原注释如下:
          /*******************/              
          bParameterChanged=YES;  //setting process flag
          if(KeyAge<1)             //如果按键一直按下,则键盘扫描函数里将使KeyAge增加到>=1,\
              flag_beep=SIGNAL;     //按键释放后KeyAge被清零

    &&和||我是无论如何都无法得到正常的结果,将编译器警告级别调至9,代码编译后无任何警告提示。
    代码如下:
     case 0x41:            //increase
            DeleteKeyCode();
            if((ParameterSetting==Disable)||(bCoverPress==ERROR))
           {
                flag_beep=ALARM;
               break;
           }
           if((*select_ptr<35)&&(flag_Setting==SealingSetting))
           {
               *select_ptr  + =1;
               KeyType=CONTINUED;
            }
           else if(*select_ptr< 99 )
           {
                ( *select_ptr ) + =1;
                KeyType=CONTINUED;
           }
           else;
           //--------刷新显示数据----------
           if(flag_Setting==VacuumSetting)
          {
                DispBuf[DPY1]=Segment[*select_ptr/10];
                DispBuf[DPY2]=Segment[*select_ptr%10];      
           }   
           if(flag_Setting==SealingSetting)
           {
                DispBuf[DPY1]=Segment[*select_ptr/10]|0x80;
                DispBuf[DPY2]=Segment[*select_ptr%10];            
           }
           /*******************/              
          bParameterChanged=YES; //setting process flag
          if(KeyAge<1)             //如果按键一直按下,则键盘扫描函数里将使KeyAge增加到>=1,
           {  flag_beep=SIGNAL; }   /*按键释放后KeyAge被清零*/
           break;
    case 0x42://digit Decrease
      仿真的结果是(*select_ptr)一直能加到99。

      至于指针,如 unsigned char volatile *ptr,明明是指向8位,但取值时要加限定符才能在观察窗口显示,如Var=(unsigned char)(*ptr),但编译时出现类型不匹配的警告,可PICC手册里似乎没有更多的指针定义修饰。

使用特权

评论回复
8
yewuyi| | 2012-11-16 15:11 | 只看该作者
1、我当前最高只用到了PICC9.80版本,我打开一个项目,在某一段注释后加入\后,编译失败,会提示错误。
2、if((ParameterSetting==Disable)||(bCoverPress==ERROR))
           {
                flag_beep=ALARM;
               break;
           }
break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句。
注意:
1)       break语句对if-else的条件语句不起作用。
2)       在多层循环中, 一个break语句只向外跳一层。
尽量不要如你那么写if和else条件代码,既容易出错,也不便于阅读和移植,类似你这种代码,就是完整的多个if和else进行条件判断,在最后写唯一一条break即可。
3、你的各种问题可能都是源于你在编写代码时使用过多的花样造成的,这其实是成为一个高水平工程师的大忌,使用最朴实的代码写法,写出最稳定的代码才是工程师追求的至境,IAR中有一个针对汽车电子专用的编译器版本,在这个版本中,很多C语言的技巧都被禁止使用,如果你非要那么写就会报错。

使用特权

评论回复
9
ailingg|  楼主 | 2012-11-16 16:32 | 只看该作者
8# yewuyi

        if((ParameterSetting==Disable)||(bCoverPress==ERROR))
           {
                flag_beep=ALARM;
                break;
           }
这几行代码正是当出现错误操作后退出switch,这里的break就是条件判断case对应的break。
   真没觉得花样繁多,if...else if条件转移应该是标准C规范。后来调试时将else if的代码暂时剪切后确实能够正确执行,但本该简单的条件转移难道要用switch case来实现?

使用特权

评论回复
10
backupyan| | 2012-12-5 11:14 | 只看该作者
搂住用的是正版的马?貌似demo版问题非常多!

使用特权

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

本版积分规则

18

主题

167

帖子

2

粉丝