c编程的问题

[复制链接]
4894|25
 楼主| 奇兵 发表于 2010-5-9 14:38 | 显示全部楼层 |阅读模式
那位大侠给我分析一下为什么用 keil编译不了!谢谢!P1为按键(独立式)P2是二极管
#include<REG51.H>
   #define uchar unsigned char
   #define uint unsigned int
   char a=0;

   void key (void);
   void delay (uint);
   void dong (void);
    void main(void)
   {
     while(1){
      uchar i;
      key();
      switch (a)
      {
       case 0xfe:
            {P2=0x00;
             delay(500);
             P2=0xff;
             delay(500);
             }break;
        case 0xfd:
             { dong();
              }  break;
         case 0xfb:
              { char j=0xff;
                for (i=0;i<8;i++)
                   {
                      j=j<<1;
                     P2=j;
                      delay (500);
                    }
               } break;
          case 0xf7:
              {  char x=0xff;
                for (i=0;i<8;i++)
                   {
                      x=x>>1;
                     P2=x;
                      delay (500);
                    }
              } break;
          }
                     
       }
         void delay (uint k)                 总在则一行提示出错!
     {    uint i,j;
          for (i=0;i<k;i++)
         {for(j=0;j<121;j++){;}
         }
      }
          void key (void)
       {  P1=0xff;
          if (P1!=0xff)
           {delay(10);
            if (P1!=0xff)
              a=P1;
            }
        }                void dong (void)
                {  P1=0x0f;
                   delay(500);
                   P2=0xf0
                   delay(500);
         }
一棵小草 发表于 2010-5-9 15:07 | 显示全部楼层
写程序太乱了!最后能整理一下,这种错误不外乎少了或多了个分号,少了或多了个大括号。
 楼主| 奇兵 发表于 2010-5-9 15:27 | 显示全部楼层
哈哈本人水平有限!有待提高!但不是多一个分号少一个分号那么简单吧!草哥
一棵小草 发表于 2010-5-9 15:48 | 显示全部楼层
}                void dong (void)
                {  P1=0x0f;
                   delay(500);
                   P2=0xf0
                   delay(500);
         }
xuyiyi 发表于 2010-5-9 15:54 | 显示全部楼层
2楼:一棵小草 大侠真是高手,经验老道,说的对极了,少了一个分号,一个大括号。

加上后就编译通过,程序附后:

#include<REG51.H>
#define uchar unsigned char
#define uint unsigned int
char a=0;

void key (void);
void delay (unsigned int);
void dong (void);

void main(void)
{
  while(1){
  uchar i;
  key();
  switch (a)
     {
         case 0xfe:
            { P2=0x00;
              delay(500);
              P2=0xff;
              delay(500);
             } break;
        case 0xfd:
             { dong();
             } break;
         case 0xfb:
             { char j=0xff;
               for (i=0;i<8;i++)
                  {
                    j=j<<1;
                    P2=j;
                    delay (500);
                  }
               } break;
          case 0xf7:
              { char x=0xff;
                for (i=0;i<8;i++)
                   {
                     x=x>>1;
                     P2=x;
                     delay (500);
                   }
              } break;
      }
      }
}

void delay (uint k)                     // 总在则一行提示出错!
{  uint i,j;                                 
   for (i=0;i<k;i++)
      { for(j=0;j<121;j++){;}
      }
}

void key (void)
{  P1=0xff;
   if (P1!=0xff)
      { delay(10);
        if (P1!=0xff)
           a=P1;
      }
}

void dong (void)
{  P1=0x0f;
   delay(500);
   P2=0xf0;
   delay(500);
}
 楼主| 奇兵 发表于 2010-5-9 16:24 | 显示全部楼层
小弟佩服我以后会细心的编程的,谢谢二位!草哥佩服!:(
 楼主| 奇兵 发表于 2010-5-9 16:34 | 显示全部楼层
怎么能避免一个程序中确保不缺少大括号呢?
strang 发表于 2010-5-9 16:49 | 显示全部楼层
要规范编程
 楼主| 奇兵 发表于 2010-5-9 17:59 | 显示全部楼层
噢!谢谢指点!有哪些规范呀?
iciciu 发表于 2010-5-9 19:02 | 显示全部楼层
这样的错误编译器都给不出提示。。。。。

要是程序大了就比较麻烦 。。。。
linqing171 发表于 2010-5-9 22:05 | 显示全部楼层
保证不出现大括号就是要不停的格式化代码。
yidou 发表于 2010-5-9 23:01 | 显示全部楼层
什么叫格式化代码?
linqing171 发表于 2010-5-10 13:02 | 显示全部楼层
一般用第三方文本编辑器的话,里面都有个菜单叫 格式化。
可以自动匹配大括号之类的。

我用notepad+ 写完了代码,用一下按c++格式化,然后大括号,缩进什么的都自动对齐。看着直观。
如果用keil的话,现在的版本也可以把插入点放大括号前面,另外半边大括号就高亮了。
xiangdongyang 发表于 2010-5-10 13:11 | 显示全部楼层
还可以用C来写个程序,让程序自己来检测括号的匹配的。
一棵小草 发表于 2010-5-10 13:58 | 显示全部楼层
格式化规范化就是对于程序,怎么命名函数,编辑风格,怎么注释等等------

你在网上搜索“规范化 编程” ,一般都有的。

比如,你的程序:

#include<REG51.H>
#define uchar unsigned char
#define uint unsigned int

/*************************************************
**变量定义
*************************************************/
char a=0;

/*************************************************
**函数声明
*************************************************/
void key (void);
void delay (uint);
void dong (void);

/*************************************************
**函数区域
*************************************************/

//---------------------------------------------------------------------
//input  : none
//output: none
//--------:
//---------------------------------------------------------------------
void main(void)
{
        while(1)
       {
               uchar i;
               key();
               switch    (a)
               {
                       case 0xfe:
                      {
                              P2=0x00;
                              delay(500);
                              P2=0xff;
                              delay(500);
                              break;
                      }
                      case 0xfd:
                      {
                             dong();
                             break;
                      }  
                      case 0xfb:
                      {
                             char j=0xff;
                             for (i=0;i<8;i++)
                            {
                                     j=j<<1;
                                     P2=j;
                                     delay (500);
                            }
                            break;
                      }
                      case 0xf7:
                     {  
                             char x=0xff;
                             for (i=0;i<8;i++)
                            {
                                    x=x>>1;
                                    P2=x;
                                    delay (500);
                            }
                            break;
                      }
               }         
        }
               //一看上去,主函数明显少个大括号

//---------------------------------------------------------------------
//input  : none
//output: none
//--------:
//---------------------------------------------------------------------
void delay (uint k)                 总在则一行提示出错!
{   
         uint i,j;
          for (i=0;i<k;i++)
         {
                 for(j=0;j<121;j++)
                 {
                          ;
                 }
         }
}

//---------------------------------------------------------------------
//input  : none
//output: none
//--------:
//---------------------------------------------------------------------
void key (void)
{  
         P1=0xff;
         if (P1!=0xff)
         {
                  delay(10);
                  if (P1!=0xff)
                  a=P1;
         }
}     

//---------------------------------------------------------------------
//input  : none
//output: none
//--------:
//---------------------------------------------------------------------        
void dong (void)
{  
         P1=0x0f;
         delay(500);
         P2=0xf0       //一看上去,明显少个符号
         delay(500);
}


规范化可以避免这些错误,同时,人家看程序也条理清晰
dragonzxs 发表于 2010-5-10 15:32 | 显示全部楼层
我也经常发生,括号和分号的问题,个人总觉就是:代码写的不规范,括号的位置放置不一致。所以少了多了括号和分号不容易发现。
 楼主| 奇兵 发表于 2010-5-15 08:21 | 显示全部楼层
谢谢各位指点!:D
ayb_ice 发表于 2010-5-15 12:26 | 显示全部楼层
应该先写括号,再补代码....
xwj 发表于 2010-5-15 12:56 | 显示全部楼层
少了多了括号和分号的话一般的程序编辑器都有明显或不明显的提示的,只要你自己仔细看下界面的就会看到了。
就连Keil都有括号配对指示哦~
wangwo 发表于 2010-5-15 13:04 | 显示全部楼层
呵呵,挺热闹的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

1254

帖子

4

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