打印
[STM32F1]

8个IF语句

[复制链接]
404|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;
                }  

使用特权

评论回复
5
shimx| | 2022-6-11 15:39 | 只看该作者
可以变成一条赋值语句,效率也可以提高一点,但会变得难于理解

使用特权

评论回复
6
kangzj| | 2022-6-11 15:41 | 只看该作者

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

使用特权

评论回复
7
chuxh| | 2022-6-11 15:44 | 只看该作者
来个for循环。。。

使用特权

评论回复
8
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]);  
        }      
}

使用特权

评论回复
9
wenfen|  楼主 | 2022-6-11 15:48 | 只看该作者
高手啊,牛X

使用特权

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

使用特权

评论回复
11
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;
                }               
        }

使用特权

评论回复
12
renyaq| | 2022-6-11 15:53 | 只看该作者

用switch语句试试

使用特权

评论回复
13
yszong| | 2022-6-11 16:00 | 只看该作者
或者看看有没有重复项合并下

使用特权

评论回复
14
renyaq| | 2022-6-11 16:02 | 只看该作者
当然可以了

使用特权

评论回复
15
heweibig| | 2022-6-11 16:04 | 只看该作者
if里边嵌套for就可以

使用特权

评论回复
16
wyjie| | 2022-6-11 16:07 | 只看该作者
if 嵌套for 然后在for里边嵌套if就行了

使用特权

评论回复
17
chuxh| | 2022-6-11 16:10 | 只看该作者
嵌套多了 会不会速度变慢

使用特权

评论回复
18
pengf| | 2022-6-11 16:13 | 只看该作者
这种有规律的直接用查表法,和函数指针打包成一个结构体,代码清晰干净

使用特权

评论回复
19
wenfen|  楼主 | 2022-6-11 16:16 | 只看该作者
好的,我明天去单位试一下,多谢各位大侠了哈

使用特权

评论回复
20
kiwis66| | 2022-6-19 14:34 | 只看该作者
if少用,容易头晕

使用特权

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

本版积分规则

737

主题

8940

帖子

8

粉丝