从函数返回一组值的最佳方法

时间:2013-11-28 03:08:33

标签: c

我有一个计数器列表,我在每个时钟中断检查每个计数器。每当计数器到期时,我需要将所有已过期的计数器返回给调用代码,以便知道哪一个已过期。什么是最优雅的方式来做同样的事情?  我正在考虑在数组中设置每个标志并进行检查。但是我发现在检查计数器到期时再进行一轮检查。

只要时钟周期到期,就会调用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 个答案:

答案 0 :(得分:0)

范式转变。请勿缩小CheckCounterExpiry()中的链接。

由于您使用全局值head与ISR(中断服务例程void CheckCounterExpiry())进行通信,当前哪些时钟处于活动状态,我建议添加另一个字段bool Active Node。在CheckCounterExpiry()中,当时钟到期时将其设置为false。

因此CheckCounterExpiry()仅更新Active字段。让另一个例程,比如Node *GetExpiredClock() 消耗去激活的时钟。如果有的话,它会得到 1 过期的时钟,否则返回NULL。它将列表缩小为1,因为这个node完成的时间。如果需要,可多次呼叫。此例程可能需要中断保护,以确保不会调用CheckCounterExpiry()

此外,内部CheckCounterExpiry()更改如下。这样就可以防止误操作一切。

// if (clocktick== temp->target)
if (clocktick >= temp->target)