gpt4 book ai didi

c - 实现带有头指针和尾指针的固定长度缓冲区

转载 作者:行者123 更新时间:2023-11-30 16:02:02 25 4
gpt4 key购买 nike

我正在实现一个固定长度的缓冲区,以分别使用尾指针或头指针读取或写入字符串。我有以下代码:

bool putBuffer(char *sMsz)
{
int iStrLen;
iStrLen = strlen(sMsz);
if(!iStrLen || iStrLen>MAX_LEN)
return 0;
while(iStrLen-->=0)
{
//if head crosses tail
if(iBufHead==iBufTail && iBufHead!=0 && dFlag)
{
while(cDebugBuf[iBufTail] != '\0')
{
iBufTail=iBufTail+1;
if (iBufTail>=CBUFF_SIZE)
iBufTail = 0;
}
iBufTail++;
}
if(iBufHead>=CBUFF_SIZE)
{
dFlag=1; // Used to know when buffer starts over writing prev data and meets tail on way
iBufHead = 0;
}
cDebugBuf[iBufHead++] = *(sMsz++);
}
return 1;
}

bool getBuffer(char *readData)
{
int i=0;
do
{
if(iBufTail==iBufHead)
return 0;
if(iBufTail>=CBUFF_SIZE)
iBufTail = 0;
readData[i++] = cDebugBuf[iBufTail++];
}while(cDebugBuf[iBufTail]!='\0');
iBufTail++;
return 1;
}

此代码一直有效,直到达到最大缓冲区,当头指针再次启动时,尾指针未正确放置。

除了查找错误之外,还有任何改进代码的建议吗?

最佳答案

对于循环缓冲区,至少有两种方法可以区分满状态和空状态(在这两种情况下,head == tail)。

  1. 允许缓冲区中多一项,而不是实际需要的项,并且在添加时不要让 head 前进到 tail (引发“缓冲区已满” “错误代替)。这样,head == tail 总是意味着空。

  2. 维护一个“空闲槽”变量以及头部和尾部,将其初始化为缓冲区的大小,在添加时递减,在删除时递增。这样,您可以通过将缓冲区设置为零来检测缓冲区已满,或者如果将其设置为原始大小则检测缓冲区为空。

<小时/>

对于选项 1,类似于:

def buffInit(sz):
global buffSz = sz
global buffData = alloc(buffSz+1) # allow for extra slot.
global buffHead = 0
global buffTail = 0

def buffAdd(item):
if (buffHead + 1) % buffSz == buffTail: # never fill extra slot.
return BUFFER_FULL
buffData[buffHead] = item
buffHead = (buffHead + 1) % buffSz
return OK

def buffGet():
if buffHead == buffTail:
return BUFFER_EMPTY
item = buffData[buffHead]
buffHead = (buffHead + 1) % buffSz
return item
<小时/>

对于选项 2,类似于:

def buffInit(sz):
global buffSz = sz
global buffFree = buffSz # extra information.
global buffData = alloc(buffSz)
global buffHead = 0
global buffTail = 0

def buffAdd(item):
if buffFree == 0: # zero free slots means full.
return BUFFER_FULL
buffData[buffHead] = item
buffHead = (buffHead + 1) % buffSz
buffFree = buffFree - 1 # keep in sync.
return OK

def buffGet():
if buffFree == buffSz:
return BUFFER_EMPTY
item = buffData[buffHead]
buffHead = (buffHead + 1) % buffSz
buffFree = buffFree + 1 # keep in sync.
return item

关于c - 实现带有头指针和尾指针的固定长度缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5786629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com