LINUX.ORG.RU

ring buffer

 ,


0

1

Написал^W Нашел на википедии реализацию сабжа на си:

/* Circular buffer example, keeps one slot open */
 
#include <stdio.h>
#include <malloc.h>
 
/* Opaque buffer element type.  This would be defined by the application. */
typedef struct { int value; } ElemType;
 
/* Circular buffer object */
typedef struct {
    int         size;   /* maximum number of elements           */
    int         start;  /* index of oldest element              */
    int         end;    /* index at which to write new element  */
    ElemType   *elems;  /* vector of elements                   */
} CircularBuffer;
 
void cbInit(CircularBuffer *cb, int size) {
    cb->size  = size + 1; /* include empty elem */
    cb->start = 0;
    cb->end   = 0;
    cb->elems = (ElemType *)calloc(cb->size, sizeof(ElemType));
}
 
void cbFree(CircularBuffer *cb) {
    free(cb->elems); /* OK if null */ }
 
int cbIsFull(CircularBuffer *cb) {
    return (cb->end + 1) % cb->size == cb->start; }
 
int cbIsEmpty(CircularBuffer *cb) {
    return cb->end == cb->start; }
 
/* Write an element, overwriting oldest element if buffer is full. App can
   choose to avoid the overwrite by checking cbIsFull(). */
void cbWrite(CircularBuffer *cb, ElemType *elem) {
    cb->elems[cb->end] = *elem;
    cb->end = (cb->end + 1) % cb->size;
    if (cb->end == cb->start)
        cb->start = (cb->start + 1) % cb->size; /* full, overwrite */
}
 
/* Read oldest element. App must ensure !cbIsEmpty() first. */
void cbRead(CircularBuffer *cb, ElemType *elem) {
    *elem = cb->elems[cb->start];
    cb->start = (cb->start + 1) % cb->size;
}
 
int main(int argc, char **argv) {
    CircularBuffer cb;
    ElemType elem = {0};
 
    int testBufferSize = 10; /* arbitrary size */
    cbInit(&cb, testBufferSize);
 
    /* Fill buffer with test elements 3 times */
    for (elem.value = 0; elem.value < 3 * testBufferSize; ++ elem.value)
        cbWrite(&cb, &elem);
 
    /* Remove and print all elements */
    while (!cbIsEmpty(&cb)) {
        cbRead(&cb, &elem);
        printf("%d\n", elem.value);
    }
 
    cbFree(&cb);
    return 0;
}

помогите, пожалуйста, написать функцию удаления элемента из буффера.

Ответ на: комментарий от anonymous

Могу предположить, что автор имеет в виду удаление из начала или конца.

По-моему в одной книге по Оккаму такое было готовое. За одно язык подучил бы :)

dave ★★★★★ ()

помогите, пожалуйста, написать функцию удаления элемента из буффера.


Она уже написана:

void cbRead(CircularBuffer *cb, ElemType *elem)

m0rph ★★★★★ ()
Ответ на: комментарий от betalor

кольцеаой буфер этого не предполагает. Кольцевой буфер реализует очередь FIFO - первый на входе, первый на выходе. Удаление элемента из конца - LIFO. Т.о. тебе просто нужна двухсторонняя очередь, у нее будут методы push/pop(вставка/удаление в голову) и shift/unshift(вставка удаление в хвост)

marvin_yorke ★★★ ()

Так это же в раздел Job надо постить.

roy ★★★★★ ()

Что это за херня? Храни индекс начального элемента и длину. Адрес нужного элемента вычисляй как (startIndex + i) % bufSize.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.