欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2465|回復(fù): 25
打印 上一主題 下一主題
收起左側(cè)

C語言判斷某個(gè)值狀態(tài)過多時(shí),如何優(yōu)化

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:277550 發(fā)表于 2024-8-1 11:15 | 只看該作者
幾十個(gè),不算多了。想優(yōu)化,在if之前優(yōu)化。
回復(fù)

使用道具 舉報(bào)

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

建議參考LCM1602、LCM12864的指令集做個(gè)散轉(zhuǎn)表,或許能實(shí)現(xiàn)。它是一個(gè)8bit的寄存器,從bit7開始,共8個(gè)標(biāo)志,除開標(biāo)志位,余下的bit是參數(shù)值(如果有的話)。。



回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

6#
ID:744809 發(fā)表于 2024-8-1 15:14 | 只看該作者
寫一個(gè)映射表,從值映射到狀態(tài),然后用switch
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

9#
ID:451718 發(fā)表于 2024-8-1 17:35 | 只看該作者
從數(shù)據(jù)結(jié)構(gòu)的角度出發(fā),你在一個(gè)分支下面查詢上千個(gè)塞選,本身就是不科學(xué)的。最好的優(yōu)化方法,就是不斷的細(xì)分,采用多級查詢。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

協(xié)議功能碼太多了,不同功能發(fā)送不同數(shù)據(jù),越寫case越多,不好搞
回復(fù)

使用道具 舉報(bào)

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

不行啊,一個(gè)數(shù)組包含的狀態(tài)也很多,導(dǎo)致RAM不夠。
回復(fù)

使用道具 舉報(bào)

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

好的,謝謝,我參考一下
回復(fù)

使用道具 舉報(bào)

15#
ID:57657 發(fā)表于 2024-8-1 21:42 | 只看該作者
li1069136863 發(fā)表于 2024-8-1 19:35
不行啊,一個(gè)數(shù)組包含的狀態(tài)也很多,導(dǎo)致RAM不夠。

你要搞清楚 C語言是單片機(jī)還是操作系統(tǒng)運(yùn)行的 寫法不一樣
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

18#
ID:1129414 發(fā)表于 2024-8-2 17:00 | 只看該作者
你寫的是啥,判斷幾千個(gè)狀態(tài),單片機(jī)估計(jì)夠嗆
回復(fù)

使用道具 舉報(bào)

19#
ID:777254 發(fā)表于 2024-8-2 20:20 | 只看該作者
Y_G_G 發(fā)表于 2024-8-2 13:07
不知道你這個(gè)是什么協(xié)議,幾千個(gè)狀態(tài),那不得幾千個(gè)函數(shù)來處理?在單片機(jī)領(lǐng)域,搞這種東西出來的,十有八九是新 ...

電表的DLT645協(xié)議,里面的協(xié)議太多,需要讀取的參數(shù)太多了,不知道怎么優(yōu)化。
回復(fù)

使用道具 舉報(bào)

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

是DLT645-2007電表協(xié)議,有做過的大佬嗎?
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

22#
ID:982617 發(fā)表于 2024-8-7 16:04 | 只看該作者
面對大量狀態(tài)處理的場景,確實(shí)單靠 `switch-case` 或 `if-else` 結(jié)構(gòu)可能會顯得冗長且難以維護(hù)。你可以考慮以下幾種優(yōu)化策略:

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

   ```c
   enum State {
       STATE_1, STATE_2, STATE_3, ... // 具體狀態(tài)
   }
   ```

2. **狀態(tài)機(jī)(State Machine)**:如果狀態(tài)之間有明確的轉(zhuǎn)換邏輯,可以設(shè)計(jì)一個(gè)狀態(tài)機(jī)來管理狀態(tài)的轉(zhuǎn)換。狀態(tài)機(jī)通過一系列狀態(tài)轉(zhuǎn)換函數(shù)或狀態(tài)對象來實(shí)現(xiàn),這樣可以清晰地表示狀態(tài)之間的依賴關(guān)系和轉(zhuǎn)換條件。

   ```c
   void process_state(State current_state) {
       switch (current_state) {
           case STATE_1:
               // 處理STATE_1邏輯
               break;
           case STATE_2:
               // 處理STATE_2邏輯
               break;
           // ...
           default:
               // 處理未知狀態(tài)
               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邏輯\
       } // 更多狀態(tài)\
   } while(0)
   ```

4. **使用函數(shù)指針或宏來封裝狀態(tài)邏輯**:如果每個(gè)狀態(tài)的處理邏輯不同且較為復(fù)雜,可以考慮使用函數(shù)指針或宏來封裝邏輯,這樣可以使得每個(gè)狀態(tài)的邏輯獨(dú)立且易于維護(hù)。

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

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

5. **使用類或結(jié)構(gòu)體**:對于復(fù)雜的狀態(tài),可以考慮使用類或結(jié)構(gòu)體來封裝狀態(tài)的屬性和處理邏輯。這樣可以更好地組織代碼,提高可讀性和可維護(hù)性。

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

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

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

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

使用道具 舉報(bào)

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

你是要實(shí)現(xiàn)協(xié)議還是做這個(gè)協(xié)議的上位機(jī)?我寫過一個(gè)簡單的上位機(jī),不復(fù)雜。要實(shí)現(xiàn)這個(gè)協(xié)議,幾十個(gè)if是合理范圍。
回復(fù)

使用道具 舉報(bào)

24#
ID:777254 發(fā)表于 2024-8-8 20:20 | 只看該作者
cnos 發(fā)表于 2024-8-8 14:05
你是要實(shí)現(xiàn)協(xié)議還是做這個(gè)協(xié)議的上位機(jī)?我寫過一個(gè)簡單的上位機(jī),不復(fù)雜。要實(shí)現(xiàn)這個(gè)協(xié)議,幾十個(gè)if是合 ...

我是接收上位機(jī)發(fā)來的DLT645協(xié)議,實(shí)現(xiàn)對應(yīng)功能。太多參數(shù)要讀寫了,目前用if else,能把連續(xù)的協(xié)議簡化,看起來沒那么臃腫
回復(fù)

使用道具 舉報(bào)

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

類是操作系統(tǒng)的運(yùn)行環(huán)境才有的,單片機(jī)內(nèi)存小幾乎不可能。
回復(fù)

使用道具 舉報(bào)

26#
ID:844772 發(fā)表于 2024-8-9 08:46 | 只看該作者
其實(shí)就是個(gè)簡單的數(shù)據(jù)庫搜索功能,但用單片機(jī)實(shí)現(xiàn)就很麻煩。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表