记一个奇怪的bug(已解决)
找到bug的原因了,真的不容易。
之前已经说过了,向buf里面写数据,只会影响结构体中紧挨着buf的那个变量。原因在于我的buf里面是两部分东西
typedef struct
{
}
前言
上文说到,我使用数组实现了一个循环队列。后来在进行测试的时候发现数据只能从前读到后,没有办法从前读。
需求
这个循环队列中保存的数据有两个用处
- 利用UDP立即发送给其他人
- 经过一定时间后,利用UDP发送给其他人
实现
typedef struct
{
buf[BUF_SIZE]; // 数据域
writepos; // 写指针
rtwritepos; //实时写指针
readpos; // 延时读指针
rtreadpos; // 实时读指针
} queue;
BUG
本来这个循环队列要实现的功能是只保存数据,并经过一定时间后发送出去,不参与实时发送功能。实时发送功能放在另外的地方实现。但后来由于需求的变动,我就将实时发送功能也放在这个结构体里实现,结构上也就是多加两个指针的事情。
在我进行实时读写数据的测试的时候,一切功能正常。然后我就大意了,没有单独进行延时读写数据的测试。于是在进行模块测试的时候,发现当写指针和实时读指针遍历了一遍数组之后,回到数组最开始的时候,延时读指针的值就发生了突变,其值超出了数组下标最大值很多。
然而我的两个读指针的变化均控制在一段代码里面进行, 如下:
if (queue->rtreadpos != rtpos)
{
queue->rtreadpos = (rtpos + 1+ BUF_SIZE) % BUF+_SIZE
}
if (queue->readpos != dpos)
{
queue->readpos = (dpos + 1+ BUF_SIZE) % BUF+_SIZE
}
除了初始化以外,整个项目里边我只在这里改变了两个读指针的值,由于rtreadpos变化快,当rtreadpos遍历一遍回到0的之后。readpos的值就会自动超过BUF_SIZE好多。
但是为什么readpos的值会自动变化呢,我不理解,我至今也不理解。
评论
0 评论