リングバッファとは、一般的には、プログラミングで配列の最初と最後の要素を繋げて、リング上にしたFIFOバッファのことです。
通常、一番初めにリングバッファにデータをエンキューする場合は、配列のインデックス0にエンキューされます。
次回のエンキューインデックスは、エンキューするごとに増え、配列の最後のインデックスにエンキューすると、次回のエンキューインデックスは、0に戻ります。
同様に、次回のデキューインデックスは、デキューするごとに増え、配列の最後のインデックスからデキューすると、次回のデキューインデックスは、0に戻ります。
なお、上記の処理に加えて、リングバッファが一杯のときにどうするかとリングバッファが空のときの処理が必要です。
また、一般的に、リングバッファは、固定サイズです。
リングバッファは、例えば、あるプログラミング言語を利用して、以下のように実現することができます。
以下は、リングバッファの構造体、リングバッファを初期化するサブルーチン、リングバッファにデータをエンキューするサブルーチン、リングバッファからデータをデキューするサブルーチンです。
#define
BUFFER_SIZE 5
struct RingBuffer{
int buffer[BUFFER_SIZE];
int read_index;
int write_index;
};
// リングバッファの初期化
void ring_buffer_init(struct RingBuffer *rb) {
rb->read_index = 0;
rb->write_index = 0;
}
// データをリングバッファに書き込む
int ring_buffer_write(struct RingBuffer *rb, int value) {
int next_write_index = rb->write_index + 1;
// 配列のサイズを超えている場合、インデックスを0にリセット
if (next_write_index >= BUFFER_SIZE) {
next_write_index = 0;
}
// バッファがいっぱいであるかどうかをチェック
if (next_write_index == rb->read_index) {
return 0; // バッファがいっぱい
}
rb->buffer[rb->write_index] = value;
rb->write_index = next_write_index;
return 1;
}
// データをリングバッファから読み込む
int ring_buffer_read(struct RingBuffer *rb, int *value) {
if (rb->read_index == rb->write_index) {
return 0; // バッファが空
}
*value = rb->buffer[rb->read_index];
rb->read_index++;
// 配列のサイズを超えている場合、インデックスを0にリセット
if (rb->read_index >= BUFFER_SIZE) {
rb->read_index = 0;
}
return 1;
}
上記を利用して、例えば、以下のようにリングバッファを利用できます。
struct RingBuffer rb;
ring_buffer_init(&rb);
ring_buffer_write(&rb, 3);
int value;
ring_buffer_read(&rb, &value);