Кольцевой буфер

компьютеры программирование алгоритм итераторы кольцевой буфер

Имеется кольцевой буфер размера MAX, имеются два итератора Put и Get, причем движутся они только в напрвлении увеличения и Put уходит от Get. При подходе к границе - следущая позиция - 0. Необходим алгоритм сдвига Get вперед на Offset позиций, но так чтобы он не перегонял Put. В случае если Offset великоват, то берется возможный максимум и записывается новое значение - оставшиеся позиции.

Интересует решение не "в лоб", т.к. такое уже сделано и не нравится.

Примечание:
Язык Си. Я просто привык, что "некрасивый код = неоптимальынй код"

byte RxSeek(byte offset)
{
if (RxGetInd <= RxPutInd)
if (RxPutInd - RxGetInd >= offset)
{
RxGetInd += offset;
offset = 0;
}
else
{
offset = RxPutInd - RxGetInd;
RxGetInd = RxPutInd;
}
else
{
if (RX_BUF_SIZE - RxGetInd + RxPutInd >= offset)
{
RxGetInd = offset - (RX_BUF_SIZE - RxGetInd);
offset = 0;
}
else
{
offset = offset - (RX_BUF_SIZE - RxGetInd) - RxPutInd;
RxGetInd = RxPutInd;
}
}
return offset;
}

Примечание:
Тогда, что такое moveFor? Весь алгоритм нужно реализовать исключительно стандартными средствами, т.к. библиотеки не подключаются. Т.е. нужна хотя бы суть этого метода, что бы самому его сделать.
Ответы:
В алгоритмическом плане здесь не может быть "не в лоб", здесь просто нет никакой загадки. Может быть вам не нравится созданный вами код? Тогда укажите его в дополнении, если я знаю этот язык то я посмотрю.
available = (RxPutInd - RxGetInd + RX_BUF_SIZE) % RX_BUF_SIZE;
moveFor = min(offset, available);
RxGetInd = (RxGetInd + moveFor) % RX_BUF_SIZE;
Где-то так. Есть остатки, зато нет ветвлений, что есть хорошо.


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.