Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 计算“的数量”;“已过”;环缓冲区索引中的元素_C_Algorithm - Fatal编程技术网

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
用于什么?自上次调用以来的事件数不应该只是索引之间的循环差吗?