Предложения для краткой обработки индекса в кольцевом буфере - PullRequest
2 голосов
/ 07 октября 2010

Я реализовал кольцевой буфер, и я хотел бы получить краткое средство обновления указателя буфера при правильной обработке циклического переноса.

Предполагая массив размером 10, мой первый ответ был примерно таким:

size_t ptr = 0;  
// do some work...
p = ++p % 10;

Статический анализ, а также gcc -Wall -Wextra справедливо ударил меня по запястью за неуказанное поведение из-за нарушения точки последовательности. Очевидное исправление - это что-то вроде:

p++;
p %= 10;

Однако я искал что-то более лаконичное (то есть однострочное) для «инкапсуляции» этой операции. Предложения? Кроме p ++; р% = 10; : -)

Ответы [ 3 ]

7 голосов
/ 07 октября 2010
p = (p + 1) % N;

или во избежание по модулю:

p = ((N-1) == p) ? 0 : (p+1);
0 голосов
/ 07 октября 2010

В отличие от p++; p%=10;, я считаю, что использование оператора запятой, как в p++, p%=10;, более квалифицируется как «однострочный».Вы можете использовать его в макросе или в теле цикла или в операторе if / else без фигурных скобок, и в результате получается значение p.

0 голосов
/ 07 октября 2010

Рассматривали ли вы ++p %= 10;

...