我剛開始學習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