2013-11-28 4 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

Elegance is C? Я не знал, что это было. – turnt

+0

Смотрите это (закрытое) задание на код golf: 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) 
Смежные вопросы