[STM32F1] 8个IF语句

[复制链接]
551|19
 楼主| wenfen 发表于 2022-6-11 15:30 | 显示全部楼层 |阅读模式
8个IF语句,怎样变简单些?
chuxh 发表于 2022-6-11 15:32 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
 楼主| wenfen 发表于 2022-6-11 15:34 | 显示全部楼层
原意是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 发表于 2022-6-11 15:36 | 显示全部楼层

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;
                }  
shimx 发表于 2022-6-11 15:39 | 显示全部楼层
可以变成一条赋值语句,效率也可以提高一点,但会变得难于理解
kangzj 发表于 2022-6-11 15:41 | 显示全部楼层

哦。。。。不行。
你的括弧里面有赋值,不能弄掉。。。
chuxh 发表于 2022-6-11 15:44 | 显示全部楼层
来个for循环。。。
xxrs 发表于 2022-6-11 15:46 | 显示全部楼层

#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]);  
        }      
}
 楼主| wenfen 发表于 2022-6-11 15:48 | 显示全部楼层
高手啊,牛X
kangzj 发表于 2022-6-11 15:50 | 显示全部楼层
楼主写代码发现有很多代码重复的时候首先要考虑到的就是能不能用查表法,自己做个表通过索引值查表
diweo 发表于 2022-6-11 15:50 | 显示全部楼层
        for(int i=0;i<8;i++)
        {
                uin8_t mask = 1<<i;
                if((err_pra[i].err_name_date != 0) && ((err_chl_date[i].chl_date &= mask) == 0x01))
                {
                        g_AckBuf[35] |= mask;
                }
                else
                {
                        g_AckBuf[35] &= ~mask;
                }               
        }
renyaq 发表于 2022-6-11 15:53 | 显示全部楼层

用switch语句试试
yszong 发表于 2022-6-11 16:00 | 显示全部楼层
或者看看有没有重复项合并下
renyaq 发表于 2022-6-11 16:02 | 显示全部楼层
当然可以了
heweibig 发表于 2022-6-11 16:04 | 显示全部楼层
if里边嵌套for就可以
wyjie 发表于 2022-6-11 16:07 | 显示全部楼层
if 嵌套for 然后在for里边嵌套if就行了
chuxh 发表于 2022-6-11 16:10 | 显示全部楼层
嵌套多了 会不会速度变慢
pengf 发表于 2022-6-11 16:13 | 显示全部楼层
这种有规律的直接用查表法,和函数指针打包成一个结构体,代码清晰干净
 楼主| wenfen 发表于 2022-6-11 16:16 | 显示全部楼层
好的,我明天去单位试一下,多谢各位大侠了哈
kiwis66 发表于 2022-6-19 14:34 | 显示全部楼层
if少用,容易头晕
您需要登录后才可以回帖 登录 | 注册

本版积分规则

737

主题

8940

帖子

8

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