2013-11-28 63 views
0

我有一個計數器列表,我正在每個時鐘中斷處檢查每個計數器。每當計數器到期時,我需要將所有到期的計數器都返回給調用代碼,以便知道哪一個已到期。什麼是最好的方法來做同樣的事情? 我正在考慮設置數組中的每個標誌並檢查。但是我發現在檢查計數器到期時再進行一輪檢查。從函數返回一組值的最佳方法

函數CheckCounterExpiry在時鐘節拍過期時被調用。返回不在下面處理,因爲這是我的查詢。

void CheckCounterExpiry() 
{ 
Node *prev, *temp; 
if (head == NULL) 
{ 
    return; 
} 
else 
{ 
    /*Check for counter and delete, return set of deleted id types as to signal   which got deleted*/ 
    prev = NULL; 
    temp = head;   
    while (temp->next != NULL) 
    { 
     if (clocktick== temp->target) 
     { 
      if (prev == NULL) 
      { 
       head = NULL; 
      } 
      /* I need to return the list of temp->counterId here. how to do it best?*/ 
      prev->next = temp->next; 
      free(temp); 

     } 
     else 
     { 
      prev= temp; 
      temp = temp->next; 
     } 

    } 

    } 

} 
+1

優雅是C?我不知道那是存在的。 – turnt

+0

看到這個(關閉)代碼高爾夫挑戰:http://codegolf.stackexchange.com/questions/15182/update-all-with-o1 –

+0

嗯,我只是在尋找一個答案。優雅可能是一個錯誤的詞。 – C0D3R

回答

0

範式轉變。請勿縮小鏈接CheckCounterExpiry()

由於您使用的是全球價值head傳達給你的ISR(中斷服務例程void CheckCounterExpiry())什麼時鐘是目前活躍,我建議另一場bool Active加入Node。在CheckCounterExpiry()中,當時鍾到期時將其設置爲false。

因此CheckCounterExpiry()只更新Active字段。讓另一個例程,如Node *GetExpiredClock()消耗去激活的時鐘。它得到過期的時鐘,如果有的話,否則返回NULL。它將列表縮小爲1 這個是當node完成時。多次呼叫,如果需要。此例程可能需要中斷保護才能確保不調用CheckCounterExpiry()

此外,內部CheckCounterExpiry()更改如下。這可以防止一切從頭到尾都會產生錯誤時鐘。

// if (clocktick== temp->target) 
if (clocktick >= temp->target) 
相關問題