C 计算“的数量”;“已过”;环缓冲区索引中的元素
如果我错过了任何类似的帖子,请道歉…C 计算“的数量”;“已过”;环缓冲区索引中的元素,c,algorithm,C,Algorithm,如果我错过了任何类似的帖子,请道歉… 我有一个存储事件数据的buffer\u SIZE元素的环形缓冲区,因此每个事件都会增加buffer\u索引,从索引0开始。 现在我有一个check\u cyclic()函数,需要计算自上次调用以来的事件数。 该函数只知道当前的缓冲区索引,并静态存储该值以计算差值。 保证BUFFER\u SIZE超过循环时间内可能发生的最大事件数。 因此,我们必须考虑到两个循环调用之间只能有一个溢出。我的实现如下: void check_cyclic(int buffer_i
我有一个存储事件数据的
buffer\u SIZE
元素的环形缓冲区,因此每个事件都会增加buffer\u索引,从索引0开始。
现在我有一个check\u cyclic()
函数,需要计算自上次调用以来的事件数。
该函数只知道当前的缓冲区索引
,并静态存储该值以计算差值。
保证BUFFER\u SIZE
超过循环时间内可能发生的最大事件数。
因此,我们必须考虑到两个循环调用之间只能有一个溢出。我的实现如下:
void check_cyclic(int buffer_index)
{
static unsigned int last_buffer_index = 0;
static unsigned int events_since_last_call = 0;
if (buffer_index < last_buffer_index)
{ // overflow occured
events_since_last_call = buffer_index + 1 + BUFFER_SIZE - last_buffer_index;
}
else
{
events_since_last_call = buffer_index + 1 - last_buffer_index;
}
last_buffer_index = buffer_index;
//... do something
}
void check\u循环(int buffer\u索引)
{
静态无符号整数最后缓冲区索引=0;
自上次调用以来的静态无符号整数事件=0;
if(缓冲区索引<最后一个缓冲区索引)
{//发生溢出
自上次调用以来的事件=缓冲区索引+1+缓冲区大小-上次缓冲区索引;
}
其他的
{
自上次调用以来的事件=缓冲区索引+1-上次缓冲区索引;
}
最后的缓冲区索引=缓冲区索引;
//…做点什么
}
当然,让事件例程本身增加一个计数器,并在check\u cyclic()
中重置它会更有效,但我们假设接口如上所示。
自从上次调用以来,是否有更有效的方法来计算事件
,如果我们对环形缓冲区定义一些要求的话?“大小必须是二的幂”或其他什么?是的,如果缓冲区容量是二的幂,并且索引是无符号的,那么差异将是(头尾)和(容量-1)
。不过,在这里我不担心性能,我更愿意将您的环形缓冲区封装到一个单独的模块中,为它提供一个用于保存数据和明确可测试的环形缓冲区函数的结构(例如size\t buff\u get\u count(struct ringbuff*rb);
或void buff\u enqueue(struct ringbuff*rb,struct event*evt)
)在计算自上次调用以来的事件时,+1
用于什么?自上次调用以来的事件数不应该只是索引之间的循环差吗?