记一个奇怪的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的值会自动变化呢,我不理解,我至今也不理解。


标题:记一个奇怪的bug(已解决)
作者:staymeloo7
联系方式:staycoolsun@gmail.com

    评论
    0 评论
avatar

取消