0

我有两个用于分配和取消分配计时器的功能。

Allocate timer 分配一个定时器,返回一个int给已分配的定时器

int allocate_timer(void)
{
  int count = 0;
  int allocated = 0;
    /*Loop to find the first timer that is not allocated*/
    for(count = 0; count< ARRAY_SIZE; count++)
    {
            if(allocated_timers[count] == '0')
            {
                    /*When the next timer available timer is found it is set to allocated and timer is set to zero*/
                    allocated_timers[count] = '1';
                    timers[count] = 0;
                    break;
            }

            else if(allocated > ARRAY_SIZE - 1)
            {
                printf("No timers available\n");
                exit(0);

            }

            else
            {
                allocated++;
            }

    }
    /*Position of the allocated timer is returned*/
    return count;
}

释放计时器,将 int 传入将要释放的位置

void deallocate_one_timer(int position)
{       
    if(TIMER_ALLOCATED == allocated_timers[position])
    {
            allocated_timers[position] = '0';
            timers[position] = 0;
    }
}

我无法让它们变得比现在更强大。关于如何让它们变得更好的任何建议?

4

2 回答 2

3

该变量allocated始终等于count(因此可以删除),并且 IMO 使用它可能会造成混淆,'0'并且'1'作为allocated_timers数组中的值。通常它是0and 1

它们都不会影响代码的健壮性,但代码越容易理解,就越能抵御未来的修改。

当您有两个“并行”数组时,就像您在此处所做的那样,每个计时器都有一个条目 intimers和一个相应的条目 in allocated_timers,值得考虑是否有一个struct包含两个成员的 a 数组更好(在这种情况下可能命名valueallocated)。有时这并不好,但通常有助于理解代码,因为读者不必发现并记住这两个数组密切相关。

deallocate_one_timer如果在将其用作数组索引之前检查它position是否在范围内0,则可以使调用者的错误使用更加健壮。ARRAY_SIZE我并不是说函数有责任进行这些检查,但它们有时有助于诊断其他地方的错误。您可以使用assert这样的非必要检查。assert有两个好处。首先,它自我说明检查不是这个函数的责任,只是你正在检查其他人是否做了他们应该做的事情。其次,如果您需要使其更小或更快,您可以轻松地禁用程序的非调试版本中的所有断言。

同样,如果释放了当前未分配的计时器,则退出并显示错误消息可能会有所帮助,因为这可能表明存在潜在问题。谁释放它两次可能会在分配它的其他人的任何一方这样做,这意味着其他人突然发现他们不再独占使用他们的计时器。

最后,timers[index]在分配和解除分配时都设置为 0。没有什么特别的错误,只是它混淆了哪个函数实际上负责确保新分配的计时器具有正确的初始值的问题。deallocate 函数什么都不做,或者它可以将计时器设置为分配的计时器不可能保持的值(可能是 -1,假设计时器从 0 上升),这样在调试时你可以立即知道如果你是使用值为 -1 的计时器,出现问题。

最后,这段代码(显然)不是线程安全的,我认为这是一种非鲁棒性。编写不能在多线程程序中使用的代码并不丢人,尤其是对于甚至可能没有创建线程能力的嵌入式系统。只要这是一个深思熟虑的决定,并记录在案。

于 2012-08-15T17:43:10.560 回答
1
  • 决定是否要使用 '0' 和 '1' 或常量,例如 deallocate_one_timer 中使用的 TIMER_ALLOCATED,并保持一致。

  • 您对allocated变量的使用是多余的。循环会更好:

    int allocate_timer(void)
    {
        int count;
    
        for (count = 0; count < ARRAY_SIZE; count++)
        {
            if (allocated_timers[count] == '0')
            {
                allocated_timers[count] = '1';
                timers[count] = 0;
                return count;
            }
        }
        fprintf(stderr, "No timers available\n");
        exit(EXIT_FAILURE);
    }
    

或者也许最好不要在失败时退出,而是返回并出错。

于 2012-08-15T18:20:37.790 回答