一生一芯系列笔记: 预学习——复习C语言(练习44笔记)

暮雨٩(๑˃̵ᴗ˂̵๑)۶终将落下 发布于 2025-02-18 596 次阅读


简介

环形缓冲区用于接收一个随机长度的数据块,在一些FIFO设备中比较常见,其逻辑和queue类似,不过queue里面存储的是一堆void*指针,而ring buffer里面存储块数据。

创建工程

复制Q42的工程,删去多余的文件。将题目中的代码添加到ring_buffer.hring_buffer.c。这里我们注意到作者使用了一个名为bstrlib.h的库文件,按照Q36的说明将文件下载加入到我们的工程。

代码

Q44要求我们给出ring_buffer_test.c的代码,这里我们根据ring buffer的主要功能给出测试代码。

#include "minunit.h"
#include <lcthw/ring_buffer.h>
#include <assert.h>

static RingBuffer* buffer = NULL;
char *tests[] = {"test1 data", "test2 data", "test3 data"};
#define NUM_TESTS 3

char *test_create()
{
    buffer = RingBuffer_create(100);
    mu_assert(buffer != NULL, "Failed to create queue.");

    return NULL;
}

char *test_destroy()
{
    mu_assert(buffer != NULL, "Failed to make queue #2");
    RingBuffer_destroy(buffer);

    return NULL;
}

char *test_read_write()
{
    int i = 0;
    for (i = 0; i < NUM_TESTS; i++)
    {
        RingBuffer_write(buffer, tests[i],10);
        bstring temp = bfromcstr(tests[i]);
        bstring temp2 = RingBuffer_gets(buffer, 10);
        mu_assert(bstricmp(temp2, temp) == BSTR_OK, "Wrong next value.");
        bdestroy(temp);
        bdestroy(temp2);
    }
    for (i = 0; i < NUM_TESTS; i++)
    {
        RingBuffer_write(buffer, tests[i],10);
        char data_in_buffer[11] = {0};
        RingBuffer_read(buffer, data_in_buffer, 10);
        bstring temp = bfromcstr(tests[i]);
        bstring temp2 = bfromcstr(data_in_buffer);
        mu_assert(bstricmp(temp2, temp) == BSTR_OK, "Wrong next value.");
        bdestroy(temp);
        bdestroy(temp2);
    }
    return NULL;
}

char *all_tests()
{
    mu_suite_start();

    mu_run_test(test_create);
    mu_run_test(test_read_write);
    mu_run_test(test_destroy);

    return NULL;
}

RUN_TESTS(all_tests);