C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  Update World C++: Сборник GPL QT исходников
  Весь сайт целиком можно загрузить по ссылкам из раздела Скачать

 Как создать циклический буфер. / Другое. / Алгоритмы

опубликован 21-09-2001 22:46 MSK   Click Here to See the Profile for zlelik   Click Here to Email zlelik  
Как создать циклический буфер.
migel опубликован 22-09-2001 13:26 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
"...Ну вы блин даете..."
читайте классику
// на птичьем языке
class Cyclic_Buffer// n()
{
public:
bool Add(const class Object& obj);
protected:
Array<Objects> m_arr; // сам буффера
int m_buffSize; // размер буфера
int m_bInsertPos;
}

// основная идея
bool Cyclic_Buffer::Add(const class Object& obj)
{
// переключимся на начало если заполнили буфер полностью
if (m_nInsertPos >= m_buffSize)
m_nInsertPos = 0;

m_arr[m_nInsertPos] = obj
}

migel опубликован 22-09-2001 16:22 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
sorry
m_arr[m_nInsertPos++] = obj
zlelik опубликован 24-09-2001 20:17 MSK     Click Here to See the Profile for zlelik  Click Here to Email zlelik     
Я понимаю что это просто, но мне нужно максимально быстро и без классов.

мне был предложен такой вариант

delay_buffer[n&delay_mask] = in;

delay_mask размер буфера -1
n меняется от 0 до delay_mask,

Я работаю со звуком и мне нужен задержанный сигнал.
Делаю так

out=delay_buffer[(n-delay)&delay_mask];

при твоем способе будет обращение к элементу с отрицательным индексом, а если сделать так
if (delay<nDelayBuffI)
out=delay_buffer[(n-delay)];
else
out=0;
то будет ноль через каждые delay_mask отсчетов (это не есть гуд)

Есть ли способ делать циклический буфер быстрее чем у меня?

migel опубликован 24-09-2001 23:30 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Ты спрашивал как сделать а не как оптимизировать
посему азы и приведены
так ведь не должно быть отрицательных индексов в циклическом буффере просто для него
if (n - delay < 0)
index = delay_mask+n-delay; //взять с хвоста
else
index = n-delay;

в принципе можно оптимизировать вычисления при переходе хвост голова через дополнения до 1 отрицательного числа (~)

Flex Ferrum опубликован 25-09-2001 10:08 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
zlelik:
Все правильно тебе предложили, только с одной оговоркой. Этот способ будет работать при величине буффера, равной одной из степеней двойки. Для произвольного размера лучше использовать такой способ:
delay_buffer[n % deleay_mask] = data;
А быстрее только на чистом асме.