2011-09-12 42 views
2

的大小以下情況:動態變化的switch-case

我的系統得到一個硬件信號,並在我的 信號處理程序的時間值寫入到緩存。之後,一個(軟件)信號以時間值作爲參數發送到相應的插槽功能。 插槽常規被正確調用,但在這裏我的問題奠定了在:

在槽函數我有一個簡單的switch-case語句是這樣的:

switch(id) { 
    case 1: 
     do something.. 
     id = 2; 
     break; 

    case 2: 
     start_time = val; 
     id = 3; 
     break; 

    case 3: 
     end_time = val; 
     id = 1; 
     break; 
} 

在這三種情況下,我存儲開始和情況2和3之間的結束時間值和 超出這些時間值我確定硬件 信號之間經過的時間。這工作正常,但現在我必須測量時間有時「更長」, 依賴於參數。這意味着,我不能停止在情況3的測量 我有案例4,5,6等等。什麼是這個「問題」 ,而不需要編寫一個優雅和最佳的解決方案:

if (param < xy) { 
    switch(id) { 
     case 1: 
      ... 
      break; 
     case 2: 
      ... 
      break; 
    } else if (param > xy) { 
     switch(id) { 
      case 1: 
       ...; 
       break; 

      case 2: 
       ...; 
       break; 

      case 3: 
       ...; 
       break; 

      case 4: 
       ...; 
       break; 

      case 5: 
       ...; 
       break; 
     } 
    } 
} 
+0

代碼是否也改變了,比如'case 1'?或者不管是哪個if-else塊,通常情況下的代碼是完全一樣的? – Nawaz

+0

不能你使用鏈接列表基本和避免這種類型的邏輯 –

+0

@ Nawaz,不在案件中的代碼不會改變它總是相同的,取決於if-else塊有時有3個或更多... – arge

回答

2

您可以嘗試以下操作:

switch ((param - xy) >= 0 ? id : -id) { 
    // param >= xy cases 
    case 1: 
     ... 
     break; 
    case 2: 
     ... 
     break; 
    ... 
    // param < xy cases 
    case -1: 
     ... 
     break; 
    case -2: 
     ... 
     break; 
    ... 
} 
0

或者一些有趣的令人興奮的,你可以寫一些自我修改代碼,以動態地改變你的swithc跳錶,因爲它接收不同的參數。你必須爲最大的表格大小分配一個足夠大的區域,並使用funciton指針或彙編程序,但可以完成。

0

嘗試使用函數指針即a.k.a.跳轉表的std::map而不是switch語句。該映射在運行時允許靈活性。

存儲一個指向該函數的指針,以及大小寫值。在地圖上搜索案例值,檢索指針並取消引用以調用該函數。