Що таке кільцевої буфер?

Реалізація бібліотечних функцій

Для створення кругового контейнера використовують його структуру для управління станом. Щоб зберегти інкапсуляцію, структура визначається в межах бібліотечного «.c файлу, а не в заголовку. При установці потрібно буде відстежувати:

  • Базовий буфер даних.
  • Максимальний розмір.
  • Поточну позицію голови, збільшується при додаванні.
  • Поточний хвіст, збільшується при видаленні.
  • Прапор, який вказує, заповнений контейнер чи ні.
  • Тепер, коли контейнер спроектований, реалізують бібліотечні функції. Кожен з API вимагає инициализированного дескриптора буфера. Замість того, щоб засмічувати код умовними твердженнями, застосовують затвердження для забезпечення виконання вимог API в стилі.

    Реалізація не буде поточно-орієнтованою, якщо в базову бібліотеку циклічних сховищ не були додані блокування. Для ініціалізації контейнера біля API є клієнти, які надають базовий розмір буфера, тому створюють його на стороні бібліотеки, наприклад, для простоти «malloc». Системи, які не можуть використовувати динамічну пам’ять, повинні змінити «init» функцію, щоб використовувати інший метод, наприклад, такий як виділення із статичного пулу контейнерів.

    Інший підхід полягає в порушенні інкапсуляції, що дозволяє користувачам статично оголошувати структури контейнерів. У цьому випадку «circular_buf_init» необхідно оновити, щоб взяти покажчик або «init», створити структуру стека і повернути її. Однак, оскільки інкапсуляція порушена, користувачі зможуть змінювати її без бібліотечних процедур. Після того як створений контейнер, заповнюють значення і викликають “reset”. Перш ніж повернутися з «init», система гарантує, що контейнер створений в порожньому стані.