我刚开始学习C语言。现在我的任务是编写一个简单的环形缓冲区。 我写了一个代码,但它不起作用。我无法解决问题,显然,我在推送和弹出功能中指出了错误的参数。需要使用头部,尾部和缓冲区的大小(问题出在我认为的尾巴上,但不能正确得到)。C上的环形缓冲区
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct ringBuffer
{
void *bufferData;
int head;
int tail;
int size;
int numElements;
};
void bufferInitialization(struct ringBuffer *buffer, int size)
{
buffer->size = size;
buffer->head = 0;
buffer->tail = 0;
buffer->numElements = 0;
buffer->bufferData = (void*)malloc(sizeof(int)*size);
}
void bufferFree(struct ringBuffer *buffer)
{
free(buffer->bufferData);
}
int pushBack(struct ringBuffer *buffer, int *data)
{
/* int i;
i = buffer->head + buffer->tail + 1;
if (i >= buffer->size)
{
i = 0;
}
buffer->bufferData[i] = data;*/
memcpy((void*)buffer->head, data, buffer->size);
buffer->head = buffer->head + buffer->size;
if (buffer->head == buffer->tail)
{
buffer->head = (int)buffer->bufferData; //error?
}
buffer->numElements++;
return 0;
}
int popFront(struct ringBuffer *buffer, void *data)
{
//void * bufferData;
/*bufferData = buffer->bufferData[buffer->head];
buffer->head++;
buffer->tail--;
if (buffer->head == buffer->size)
{
buffer->head = 0;
}
//return bufferData;*/
memcpy(data, (void*)buffer->tail, buffer->size); //error?
buffer->tail = buffer->tail + buffer->size;
if ((void*)buffer->tail == buffer->bufferData)
{
buffer->tail = (int)buffer->bufferData; //error?
}
buffer->numElements--;
return 0;
}
int main()
{
struct ringBuffer buffer;
int size = 5;
//*buffer->size = 6;
bufferInitialization(&buffer, size);
char *data[] = { "1" , "2", "3", "4" , "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20" };
for (int i = 0; i < size; i++)
{
printf("Push: data[%d] = %s\n", i, *data[i]);
pushBack(&buffer, (int*)data[i]);
}
printf("\n");
for (int i = 0; i < size; i++)
{
printf("PushBack: queue[%d] = %s\n", i, (ringBuffer*)popFront(&buffer, (void*)data[i])); // !!!
}
printf("\n");
for (int i = 0; i < size; i++)
{
printf("PopFront: data[%d] = %s\n", i, *data[i]);
pushBack(&buffer, (int*)data[i]);
}
printf("\n");
system("pause");
return 0;
}
感谢您的任何帮助和建议!
你解决编写代码之前在纸上出现问题? –
1)编写几个单元测试,以显示程序运行正常。 2)调试所有的单元测试失败时,您可以找到并修复您的逻辑错误。 3)利润 – AndyG
“调试我的代码”不在这里的话题。你调试它,然后你告诉我们问题是什么。显示它做什么以及它应该做什么。最好有一个最小的,完整的和可验证的例子:https://stackoverflow.com/help/mcve – klutt