发新帖本帖赏金 5.00元(功能说明)我要提问
返回列表
打印
[STM32F1]

C语言问题

[复制链接]
1133|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 | 只看该作者
哦。。。。不行。
你的括弧里面有赋值,不能弄掉。。。

使用特权

评论回复
5
zhuomuniao110| | 2017-7-22 21:11 | 只看该作者
来个for循环。。。

使用特权

评论回复
6
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
7
liuoulyy|  楼主 | 2017-7-26 20:31 | 只看该作者
高手啊,牛X

使用特权

评论回复
8
feelhyq| | 2017-7-28 10:26 | 只看该作者

楼主写代码发现有很多代码重复的时候首先要考虑到的就是能不能用查表法,自己做个表通过索引值查表

使用特权

评论回复
发新帖 本帖赏金 5.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

134

主题

472

帖子

1

粉丝