打印
[STM32F1]

C语言问题

[复制链接]
668|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wenfen|  楼主 | 2018-8-29 08:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
8个IF语句,怎样变简单些?
沙发
bqyj| | 2018-8-29 08:54 | 只看该作者

楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
wenfen|  楼主 | 2018-8-29 08:56 | 只看该作者
原意是8个结构变量只要不为0,并且err_chl_date[0].chl_date的8个不同的位,置1为真,那么数组g_AckBuf[35]的8个位分别置1.要不就为0
if((err_pra[0].err_name_date!=0) && ((err_chl_date[0].chl_date &= 0x01)==0x01))  
                                                                    {
                                                                                        g_AckBuf[35]|=0x01;
                                                                     }
                                                                 else {
                       g_AckBuf[35]&=0xf7;
                                                                       }        
                                                               
                                                                if((err_pra[1].err_name_date!=0) && ((err_chl_date[1].chl_date &= 0x02)==0x01))
                                                                    {
                                                                                        g_AckBuf[35]|=0x02;
                                                                     }
                                                                 else {
                       g_AckBuf[35]&=0xfd;
                                                                       }        
                                                               
                if((err_pra[2].err_name_date!=0) && ((err_chl_date[2].chl_date &= 0x04)==0x01))
                                                                    {
                                                                                        g_AckBuf[35]|=0x04;
                                                                     }
                                                                 else {
                       g_AckBuf[35]&=0xfb;
                                                                       }        
                                                               
                                                                if((err_pra[3].err_name_date!=0) && ((err_chl_date[3].chl_date &= 0x08)==0x01))
                                                                    {
                                                                                        g_AckBuf[35]|=0x08;
                                                                     }
                                                                 else {
                       g_AckBuf[35]&=0xf7;
                                                                       }               
                                                               
                if((err_pra[4].err_name_date!=0) && ((err_chl_date[4].chl_date &= 0x10)==0x01))
                                                                    {
                                                                                        g_AckBuf[35]|=0x10;
                                                                     }
                                                                 else {
                       g_AckBuf[35]&=0xef;
                                                                       }               
                                                               
                                                                if((err_pra[5].err_name_date!=0) && ((err_chl_date[5].chl_date &= 0x20)==0x01))
                                                                    {
                                                                                        g_AckBuf[35]|=0x20;
                                                                     }
                                                                 else {
                       g_AckBuf[35]&=0xdf;
                                                                       }        
                                                               
                if((err_pra[6].err_name_date!=0) && ((err_chl_date[6].chl_date &= 0x40)==0x01))
                                                                    {
                                                                                        g_AckBuf[35]|=0x40;
                                                                     }
                                                                 else {
                       g_AckBuf[35]&=0xbf;
                                                                       }        
                                                               
                                                                if((err_pra[7].err_name_date!=0) && ((err_chl_date[7].chl_date &= 0x80)==0x01))
                                                                    {
                                                                                        g_AckBuf[35]|=0x80;
                                                                     }
                                                           else {
                       g_AckBuf[35]&=0x7f;
                                                                       }            

使用特权

评论回复
地板
wenfen|  楼主 | 2018-8-29 08:59 | 只看该作者

if((err_pra[0].err_name_date!=0) && ((err_chl_date[0].chl_date &= 0x01)==0x01))
       {
                g_AckBuf[35]|=0x01;
          }
         else {
                       g_AckBuf[35]&=0xf7;
                  }        
if((err_pra[1].err_name_date!=0) && ((err_chl_date[1].chl_date &= 0x02)==0x02))
          {
                g_AckBuf[35]|=0x02;
                 }
        else {
                       g_AckBuf[35]&=0xfd;
                 }        
                                                               
if((err_pra[2].err_name_date!=0) && ((err_chl_date[2].chl_date &= 0x04)==0x04))
                   {
                                g_AckBuf[35]|=0x04;
                   }
         else {
                       g_AckBuf[35]&=0xfb;
                 }        
                                                               
if((err_pra[3].err_name_date!=0) && ((err_chl_date[3].chl_date &= 0x08)==0x08))
                 {
                        g_AckBuf[35]|=0x08;
                          }
else {
             g_AckBuf[35]&=0xf7;
         }               
                                                               
if((err_pra[4].err_name_date!=0) && ((err_chl_date[4].chl_date &= 0x10)==0x10))
                 {
                        g_AckBuf[35]|=0x10;
                 }
else {
                 g_AckBuf[35]&=0xef;
           }               
                                                               
if((err_pra[5].err_name_date!=0) && ((err_chl_date[5].chl_date &= 0x20)==0x20))
         {
                g_AckBuf[35]|=0x20;
          }
else {
              g_AckBuf[35]&=0xdf;
         }        
                                                               
if((err_pra[6].err_name_date!=0) && ((err_chl_date[6].chl_date &= 0x40)==0x40))
                 {
                        g_AckBuf[35]|=0x40;
                  }
        else {
                       g_AckBuf[35]&=0xbf;
                 }        
                                                               
if((err_pra[7].err_name_date!=0) && ((err_chl_date[7].chl_date &= 0x80)==0x80))
         {
                g_AckBuf[35]|=0x80;
           }
        else {
                       g_AckBuf[35]&=0x7f;
                }               

使用特权

评论回复
5
gongche| | 2018-8-29 09:01 | 只看该作者
可以变成一条赋值语句,效率也可以提高一点,但会变得难于理解

使用特权

评论回复
6
dengdc| | 2018-8-29 09:03 | 只看该作者

哦。。。。不行。
你的括弧里面有赋值,不能弄掉。。。

使用特权

评论回复
7
huwr| | 2018-8-29 09:05 | 只看该作者

来个for循环。。。

使用特权

评论回复
8
huwr| | 2018-8-29 09:08 | 只看该作者
#define MAX_NUM  (unsigned char)0xff
#define CNT           (unsigned char)0x08

const unsigned char Tab[CNT] = {0x01, 0x02, 0x04 ,0x08, 0x10, 0x20, 0x40, 0x80};
unsigned char u8Loop = 0;

for (; u8Loop < CNT; u8Loop++)
{
        if (0 != err_pra[u8Loop].err_name_date)
        {
                 if (Tab[u8Loop]  == (err_chl_date[u8Loop].chl_date & Tab[u8Loop]))
                 {
                          g_AckBuf[35] |= ab[u8Loop];        
                 }
                 else
                 {
                         g_AckBuf[35] &= (MAX_NUM - ab[u8Loop]);     
                 }
        }
        else
        {
                g_AckBuf[35] &= (MAX_NUM - ab[u8Loop]);  
        }      
}

使用特权

评论回复
9
wenfen|  楼主 | 2018-8-29 09:12 | 只看该作者
高手啊,牛X

使用特权

评论回复
10
huwr| | 2018-8-29 09:16 | 只看该作者
楼主写代码发现有很多代码重复的时候首先要考虑到的就是能不能用查表法,自己做个表通过索引值查表

使用特权

评论回复
11
wenfen|  楼主 | 2018-8-29 09:19 | 只看该作者

好的,我明天去单位试一下,多谢各位大侠了哈,结贴了先        

使用特权

评论回复
12
huahuagg| | 2018-8-29 11:05 | 只看该作者
case

使用特权

评论回复
13
huahuagg| | 2018-8-29 11:05 | 只看该作者
switch case

使用特权

评论回复
14
CaLipton| | 2018-8-30 09:57 | 只看该作者
用switch语句试试

使用特权

评论回复
15
keaibukelian| | 2018-9-3 11:19 | 只看该作者
用switch语句试试

使用特权

评论回复
16
wowu| | 2018-9-3 11:50 | 只看该作者
或者看看有没有重复项合并下

使用特权

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

本版积分规则

737

主题

8940

帖子

8

粉丝