我有两个分配和释放计时器的函数。
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;
}
}
我看不见他们比现在更强壮了。
有什么建议可以让他们变得更好吗?
最佳答案
变量allocated
始终等于count
(因此可以删除),而且在'0'
数组中使用'1'
和allocated_timers
作为值可能会造成混淆。通常是0
和1
。
它们都不会影响代码的健壮性,但是代码越容易理解,对将来的修改就越健壮。
当您有两个“并行”数组时,就像您在这里所做的那样,每个计时器在timers
中有一个条目,在allocated_timers
中有一个对应的条目,那么值得考虑的是,是否最好有一个包含两个成员的struct
的数组(在本例中,可能命名为value
和allocated
)。有时它并不好,但它通常有助于理解代码,因为读者不必发现并记住这两个数组是密切相关的。
如果在将deallocate_one_timer
用作数组索引之前检查它是否在position
到0
的范围内,则可以使ARRAY_SIZE
稍微更健壮一些,以防止调用方错误地使用它。我不是说函数有责任执行这些检查,但它们有时有助于诊断其他地方的错误。您可以使用assert
进行此类非必要检查。assert
有两个好处。首先,它自己记录了检查不是这个函数的职责,只是检查其他人做了他们应该做的事情。其次,如果需要使程序更小或更快,可以很容易地禁用程序的非调试生成中的所有断言。
类似地,如果在当前未分配的计时器被释放,则退出错误消息可能是有帮助的,因为这很可能指示潜在的问题。不管是谁两次释放它,都可能是另一方分配它,这意味着另一方突然发现他们不再独占自己的计时器。
最后,在allocate和deallocate上都将timers[index]
设置为0。除了混淆了哪个函数实际上负责确保新分配的计时器具有正确的初始值之外,没有什么特别的错误。deallocate函数无法执行任何操作,或者它可以将计时器设置为分配的计时器无法保持的值(可能是-1,假设计时器从0开始增加),以便在调试时可以立即知道,如果使用值为-1的计时器,则会出现问题。
最后,这段代码(显然)不是线程安全的,我认为这是一种非健壮性。编写不能在多线程程序中使用的代码,尤其是那些甚至没有能力创建线程的嵌入式系统,这一点并不丢脸。只要这是一个深思熟虑的决定,并且有记录在案。
关于c - 强大的功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11974224/