【发布时间】:2017-03-28 05:34:27
【问题描述】:
我是编程的初学者,但我对循环缓冲区的任务有点卡住了。我为我的环形缓冲区编写了函数 push 和 pop ,它是如何工作的,它似乎是有效的。但是,当我使用 pushBack 和循环“for”中的每个元素实现 dataBuffer 时,我得到了不同的 head 值。在我的示例中可以看到(我只能在结构中使用 4 个值 + 第 5 个被添加用于计算头尾之间的元素数):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct ringBuffer
{
int *bufferData;
int head;
int tail;
int size;
int num;
};
void bufferFree(struct ringBuffer *buffer)
{
free(buffer->bufferData);
}
void bufferInitialization(struct ringBuffer *buffer, int size)
{
buffer->size = size;
buffer->head = 0;
buffer->tail = 0;
buffer->bufferData = (int*)malloc(sizeof(int) * size);
}
int pushBack(struct ringBuffer *buffer, int data)
{
buffer->bufferData[buffer->tail++] = data;
if (buffer->tail == buffer->size)
{
buffer->tail = 0;
}
return 0;
}
int popFront(struct ringBuffer *buffer)
{
if (buffer->head != buffer->tail)
{
buffer->head++;
if (buffer->head == buffer->size)
{
buffer->head = 0;
}
}
return 0;
}
int bufferSize(struct ringBuffer *buffer)
{
//int numElements;
//numElements = (buffer->size + buffer->head + buffer->tail) % buffer->size; // 8 + 0 + 6 % 8 = 6;
if (buffer->head >= buffer->tail)
{
return (buffer->head - buffer->tail);
}
else
{
return ((buffer->size - buffer->tail) + buffer->head);
}
/*if (buffer->head = !buffer->tail)
{
for (buffer->head = 0; buffer->head < buffer->tail; buffer->head++)
{
printf("head[%d] and tail[%d] --> bufferData = %d", buffer->head, buffer->tail, buffer->bufferData);
}
}*/
return 0;
}
int printBuffer(struct ringBuffer *buffer)
{
int size = bufferSize((ringBuffer*)buffer->size);
int i = buffer->head;
while (buffer->size >= 0)
{
if (!buffer->bufferData)
{
printf("Buffer is empty\n");
return -1;
}
else if (i == buffer->size)
{
i = 0;
}
printf(" \n");
buffer->size--;
}
/*printf("Values from HEAD to TAIL: ");
if (buffer->head == buffer->tail)
{
printf("Head and tail are equals, not possible to show data\n");
}
else
{
printf("bufferData[%d] = %d\n", buffer->bufferData);
}*/
}
int main(int argc, char* argv[])
{
struct ringBuffer buffer;
int size = 8;
int data[] = { 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 }; // 20 values
int dataSize = sizeof(data) / sizeof(data[0]);
bufferInitialization(&buffer, size);
printf("1st implementation\n");
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
//printf("Current num elements = \n", bufferSize((ringBuffer*)buffer.num));
printf("2nd implementation\n");
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
pushBack(&buffer, 10); printf("head = %d, tail = %d\n", buffer.head, buffer.tail);
bufferFree(&buffer);
printf("\nInisialization\n");
bufferInitialization(&buffer, size);
printf("head = %d, tail = %d - then implementation\n", buffer.head, buffer.tail);
for (int i = 0; i < dataSize; i++)
{
pushBack(&buffer, data[i]);
printf("head = %d, tail = %d, dataBuffer = %d\n", buffer.head, buffer.tail, data[i]);
popFront(&buffer);
}
printf("\nbufferData check:\n");
for (int i = 0; i < size; i++)
{
printf("[%d] = %d ", i, buffer.bufferData[i]);
}
printf("\nhead = %d, tail = %d\n", buffer.head, buffer.tail);
bufferFree(&buffer);
system("pause");
return 0;
}
我还必须编写一个函数来显示“头”和“尾”之间的元素数量。对于 for 循环,head 和 tail 之间始终存在 1 值,在第一个实现中,head 始终 = 0(当所有缓冲区都实现时,head = tail)。这里的名字是bufferSize。我必须打印出来。
如何解决head和tail的这个问题以及如何编写正确的printBuffer函数?
谢谢
【问题讨论】:
标签: c