[STM32F1] C语言问题

[复制链接]
1302|7
 楼主| liuoulyy 发表于 2017-7-22 18:25 | 显示全部楼层 |阅读模式
8个IF语句,怎样变简单些?原意是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;
                                                                       }                       
 楼主| liuoulyy 发表于 2017-7-22 18:54 | 显示全部楼层
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;
                }                       
戈卫东 发表于 2017-7-22 19:08 | 显示全部楼层
可以变成一条赋值语句,效率也可以提高一点,但会变得难于理解
戈卫东 发表于 2017-7-22 19:11 | 显示全部楼层
哦。。。。不行。
你的括弧里面有赋值,不能弄掉。。。
zhuomuniao110 发表于 2017-7-22 21:11 | 显示全部楼层
来个for循环。。。
feelhyq 发表于 2017-7-23 23:11 | 显示全部楼层
本帖最后由 feelhyq 于 2017-7-23 23:25 编辑
liuoulyy 发表于 2017-7-22 18:54
if((err_pra[0].err_name_date!=0) && ((err_chl_date[0].chl_date &= 0x01)==0x01))
       {
                g_AckBuf ...

/* 不知道你的数据类型是什么,我按照“U8”给你处理了,已经很久没写代码了 */
#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]);  
        }      
}










打赏榜单

liuoulyy 打赏了 5.00 元 2017-07-28

评分

参与人数 1威望 +4 收起 理由
liuoulyy + 4

查看全部评分

 楼主| liuoulyy 发表于 2017-7-26 20:31 来自手机 | 显示全部楼层
高手啊,牛X
feelhyq 发表于 2017-7-28 10:26 | 显示全部楼层

楼主写代码发现有很多代码重复的时候首先要考虑到的就是能不能用查表法,自己做个表通过索引值查表
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

472

帖子

1

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