gpt4 book ai didi

c - 强大的功能

转载 作者:太空宇宙 更新时间:2023-11-04 06:38:29 25 4
gpt4 key购买 nike

我有两个函数用于分配和取消分配定时器。

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;
}

解除分配定时器,将一个整数传入将要解除分配的位置

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

我无法让它们变得比现在更坚固。有关如何使它们变得更好的任何建议?

最佳答案

变量 allocated 总是等于 count(因此可以删除),IMO 使用 '0''1' 作为 allocated_timers 数组中的值。通常是 01

它们都不会影响代码的健壮性,但代码越容易理解,它对 future 修改的健壮性就越高。

当你有两个“并行”数组时,就像你在这里所做的那样,每个计时器在 timers 中都有一个条目,在 allocated_timers 中有一个相应的条目,值得考虑是否最好有一个包含两个成员的 struct 数组(在本例中可能命名为 valueallocated)。有时它并没有更好,但通常它有助于理解代码,因为读者不必发现并记住这两个数组密切相关。

deallocate_one_timer 如果检查 position 是否在 0 范围内,则可以稍微增强一点来防止调用者的错误使用>ARRAY_SIZE 在将其用作数组索引之前。我并不是说函数有责任进行这些检查,但它们有时会帮助诊断其他地方的错误。您可以使用 assert 进行这样的非必要检查。 assert 有两个好处。首先,它 self 记录检查不是该功能的责任来处理,只是您正在检查其他人是否做了他们应该做的事情。其次,如果您需要使程序更小或更快,您可以轻松地禁用程序的非调试版本中的所有断言。

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

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

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

关于c - 强大的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11974224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com