久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2261|回復: 25
打印 上一主題 下一主題
收起左側

C語言判斷某個值狀態過多時,如何優化

  [復制鏈接]
回帖獎勵 10 黑幣 回復本帖可獲得 10 黑幣獎勵! 每人限 2 次
跳轉到指定樓層
樓主
假定有一個16位變量,代表不同狀態,狀態有幾千種,且某些功能的狀態值是不連續的。
開始使用swtch case寫,發現case太多了,放棄。
又改成if else判斷,這樣可以把某些連續的狀態使用一個判斷完成,但是寫下來還是有幾十個if else.
還能在優化嗎?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

來自 13#
ID:777254 發表于 2024-8-1 19:41 | 只看該作者
目前的解析一個協議,一開始用witch,分支有數據讀寫之類的幾個大case;然后讀功能里面需要讀的協議太多了,我看了協議文檔,幾千條。所以讀分支里面不能再用switch了,不然又有幾千個分支。目前是在讀分支里面使用if else寫著。因為查表法需要數組,RAM也要花費好多,所以暫時不用數組建立表了。還有好方法嗎?盡量不占用/少用RAM空間
回復

使用道具 舉報

沙發
ID:1109793 發表于 2024-8-1 10:21 | 只看該作者
幾千種,那可是復雜了,這么復雜的系統,厲害了。要不先分開,比如>10<20,每10個分一組?
回復

使用道具 舉報

板凳
ID:277550 發表于 2024-8-1 11:15 | 只看該作者
幾十個,不算多了。想優化,在if之前優化。
回復

使用道具 舉報

地板
ID:69038 發表于 2024-8-1 11:18 | 只看該作者
"假定有一個16位變量,代表不同狀態,狀態有幾千種,且某些功能的狀態值是不連續的。"
如果真有幾千種的狀態,只能說這個系統架構有問題了。才疏學淺想不出這么多復雜的狀態,只用一個16位變量來表示。。

建議參考LCM1602、LCM12864的指令集做個散轉表,或許能實現。它是一個8bit的寄存器,從bit7開始,共8個標志,除開標志位,余下的bit是參數值(如果有的話)。。



回復

使用道具 舉報

5#
ID:276663 發表于 2024-8-1 12:41 | 只看該作者
跟樓上意思類似,借鑒IPV4,使用掩碼分級判斷,歸類處理
回復

使用道具 舉報

6#
ID:744809 發表于 2024-8-1 15:14 | 只看該作者
寫一個映射表,從值映射到狀態,然后用switch
回復

使用道具 舉報

7#
ID:220661 發表于 2024-8-1 15:44 | 只看該作者
數組吧,節省空間,提升速度。
回復

使用道具 舉報

8#
ID:1087128 發表于 2024-8-1 16:16 | 只看該作者
if先判斷一個范圍
回復

使用道具 舉報

9#
ID:451718 發表于 2024-8-1 17:35 | 只看該作者
從數據結構的角度出發,你在一個分支下面查詢上千個塞選,本身就是不科學的。最好的優化方法,就是不斷的細分,采用多級查詢。
回復

使用道具 舉報

10#
ID:624769 發表于 2024-8-1 18:43 | 只看該作者
c語言如何實現 不太清楚, 匯編的話,可以根據變量值  直接跳轉若干行(比如: JMP  @A+PC),然后在  相應的位置寫下分支就可以了。
回復

使用道具 舉報

11#
ID:777254 發表于 2024-8-1 19:33 | 只看該作者
xiaobendan001 發表于 2024-8-1 10:21
幾千種,那可是復雜了,這么復雜的系統,厲害了。要不先分開,比如>10

協議功能碼太多了,不同功能發送不同數據,越寫case越多,不好搞
回復

使用道具 舉報

12#
ID:777254 發表于 2024-8-1 19:35 | 只看該作者
gongnn 發表于 2024-8-1 15:44
數組吧,節省空間,提升速度。

不行啊,一個數組包含的狀態也很多,導致RAM不夠。
回復

使用道具 舉報

14#
ID:777254 發表于 2024-8-1 19:41 | 只看該作者
zhuls 發表于 2024-8-1 11:18
"假定有一個16位變量,代表不同狀態,狀態有幾千種,且某些功能的狀態值是不連續的。"
如果真有幾千種的狀 ...

好的,謝謝,我參考一下
回復

使用道具 舉報

15#
ID:57657 發表于 2024-8-1 21:42 | 只看該作者
li1069136863 發表于 2024-8-1 19:35
不行啊,一個數組包含的狀態也很多,導致RAM不夠。

你要搞清楚 C語言是單片機還是操作系統運行的 寫法不一樣
回復

使用道具 舉報

16#
ID:57657 發表于 2024-8-1 21:51 | 只看該作者
用二分查找,找到的取出索引 然后用該索引地址定位到函數指針數組執行相應的函數,找不到的執行default。
回復

使用道具 舉報

17#
ID:401564 發表于 2024-8-2 13:07 | 只看該作者
不知道你這個是什么協議,幾千個狀態,那不得幾千個函數來處理?在單片機領域,搞這種東西出來的,十有八九是新手
還不如果直接說,你要干嘛,說不定網還能幫到你
如果說從一開始,方向就是錯的,那就太浪費時間了
回復

使用道具 舉報

18#
ID:1129414 發表于 2024-8-2 17:00 | 只看該作者
你寫的是啥,判斷幾千個狀態,單片機估計夠嗆
回復

使用道具 舉報

19#
ID:777254 發表于 2024-8-2 20:20 | 只看該作者
Y_G_G 發表于 2024-8-2 13:07
不知道你這個是什么協議,幾千個狀態,那不得幾千個函數來處理?在單片機領域,搞這種東西出來的,十有八九是新 ...

電表的DLT645協議,里面的協議太多,需要讀取的參數太多了,不知道怎么優化。
回復

使用道具 舉報

20#
ID:777254 發表于 2024-8-2 20:28 | 只看該作者
li1069136863 發表于 2024-8-1 19:41
目前的解析一個協議,一開始用witch,分支有數據讀寫之類的幾個大case;然后讀功能里面需要讀的協議太多了 ...

是DLT645-2007電表協議,有做過的大佬嗎?
回復

使用道具 舉報

21#
ID:57657 發表于 2024-8-2 22:24 | 只看該作者
狀態表數組使用二分查找 可以不連續但必須從小到大排序,找到的返回索引,找不到的返回指定數字。
然后用索引訪問指針表數組,取出函數指針并傳遞參數執行,最后取回返回值,如果參數還傳遞其他數據類型或數組可能涉及多級指針。
回復

使用道具 舉報

22#
ID:982617 發表于 2024-8-7 16:04 | 只看該作者
面對大量狀態處理的場景,確實單靠 `switch-case` 或 `if-else` 結構可能會顯得冗長且難以維護。你可以考慮以下幾種優化策略:

1. **枚舉類型(Enum)**:將狀態值定義為枚舉類型,這樣不僅代碼更清晰,還可以利用編譯器的靜態檢查避免狀態值的誤用。枚舉類型能提供更好的可讀性,并且可以更方便地添加或修改狀態。

   ```c
   enum State {
       STATE_1, STATE_2, STATE_3, ... // 具體狀態
   }
   ```

2. **狀態機(State Machine)**:如果狀態之間有明確的轉換邏輯,可以設計一個狀態機來管理狀態的轉換。狀態機通過一系列狀態轉換函數或狀態對象來實現,這樣可以清晰地表示狀態之間的依賴關系和轉換條件。

   ```c
   void process_state(State current_state) {
       switch (current_state) {
           case STATE_1:
               // 處理STATE_1邏輯
               break;
           case STATE_2:
               // 處理STATE_2邏輯
               break;
           // ...
           default:
               // 處理未知狀態
               break;
       }
   }
   ```

3. **宏定義**:對于某些頻繁使用的邏輯,可以考慮使用宏來定義,簡化代碼并提高可讀性。

   ```c
   #define PROCESS_STATE(state) do {\
       if (state == STATE_1) {\
           // 處理STATE_1邏輯\
       } else if (state == STATE_2) {\
           // 處理STATE_2邏輯\
       } else if (state == STATE_3) {\
           // 處理STATE_3邏輯\
       } // 更多狀態\
   } while(0)
   ```

4. **使用函數指針或宏來封裝狀態邏輯**:如果每個狀態的處理邏輯不同且較為復雜,可以考慮使用函數指針或宏來封裝邏輯,這樣可以使得每個狀態的邏輯獨立且易于維護。

   ```c
   typedef void (*StateHandler)(void);
   StateHandler state_handlers[] = {
       &process_state_1,
       &process_state_2,
       // 更多狀態函數\
   };

   void process_state(State state) {
       state_handlers[state]();
   }
   ```

5. **使用類或結構體**:對于復雜的狀態,可以考慮使用類或結構體來封裝狀態的屬性和處理邏輯。這樣可以更好地組織代碼,提高可讀性和可維護性。

   ```c
   struct State {
       void (*handle)(void);
   };

   void process_state(State state) {
       state.handle();
   }
   ```

6. **性能考慮**:在選擇優化策略時,也需要考慮性能影響。宏和函數調用在某些情況下可能會帶來額外的開銷。在進行優化時,可以先進行性能測試,確保優化后代碼的執行效率滿足需求。

通過上述方法,你可以更有效地管理和處理大量狀態,提高代碼的可讀性和可維護性。根據具體需求和場景,選擇最適合的優化策略。
回復

使用道具 舉報

23#
ID:688692 發表于 2024-8-8 14:05 | 只看該作者
li1069136863 發表于 2024-8-2 20:28
是DLT645-2007電表協議,有做過的大佬嗎?

你是要實現協議還是做這個協議的上位機?我寫過一個簡單的上位機,不復雜。要實現這個協議,幾十個if是合理范圍。
回復

使用道具 舉報

24#
ID:777254 發表于 2024-8-8 20:20 | 只看該作者
cnos 發表于 2024-8-8 14:05
你是要實現協議還是做這個協議的上位機?我寫過一個簡單的上位機,不復雜。要實現這個協議,幾十個if是合 ...

我是接收上位機發來的DLT645協議,實現對應功能。太多參數要讀寫了,目前用if else,能把連續的協議簡化,看起來沒那么臃腫
回復

使用道具 舉報

25#
ID:57657 發表于 2024-8-9 05:30 | 只看該作者
hezezeze 發表于 2024-8-7 16:04
面對大量狀態處理的場景,確實單靠 `switch-case` 或 `if-else` 結構可能會顯得冗長且難以維護。你可以考慮 ...

類是操作系統的運行環境才有的,單片機內存小幾乎不可能。
回復

使用道具 舉報

26#
ID:844772 發表于 2024-8-9 08:46 | 只看該作者
其實就是個簡單的數據庫搜索功能,但用單片機實現就很麻煩。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一本色道久久综合亚洲精品高清 | 精品成人佐山爱一区二区 | 一级欧美 | 国产丝袜一区二区三区免费视频 | 日韩欧美大片在线观看 | 欧美在线一区二区三区四区 | 中文在线一区二区 | av不卡一区 | 国产高清自拍视频在线观看 | 色男人天堂av | 亚洲国产精品日韩av不卡在线 | 国产日韩欧美另类 | 久久国产一区二区三区 | 中国黄色毛片视频 | 久久久久国产一级毛片 | 成人午夜精品 | 中文字幕免费在线 | 日本一区视频在线观看 | 国产视频一视频二 | 国产香蕉视频在线播放 | 伊人久久大香线 | 国产小视频在线 | 久久国产亚洲 | 国产成人精品午夜视频免费 | 午夜在线视频 | 高清视频一区二区三区 | 无码日韩精品一区二区免费 | 亚洲女优在线播放 | 日本国产精品视频 | 精品久久久久久亚洲综合网 | 国产一区不卡在线观看 | www.47久久青青| 国产一区二区三区在线 | 亚洲自拍偷拍欧美 | 欧美日韩成人 | aaa综合国产| 99re视频这里只有精品 | 免费特黄视频 | 精品欧美黑人一区二区三区 | 99久久精品一区二区毛片吞精 | 成年网站在线观看 |