Цитата(starter48 @ Oct 27 2005, 14:52)
Если циклический буфер, то так писать можно при условии, что размер буфера равен макс. числу в перенной size (65536 для 16bit int). Иначе надо писать size = (wr_ptr - rd_ptr) % BUFFER_SIZE; без всяких if.
Или, для оригинального варианта, следует заменить 0 на BUFFER_SIZE:
Код
uint size;
ulong wr_ptr,rd_ptr;
if(wr_ptr >= rd_ptr) size = wr_ptr - rd_ptr;
else size = BUFFER_SIZE - rd_ptr + wr_ptr;
Боже упаси. % BUFFER_SIZE просто нельзя. Если ошибок в получении wr_ptr и rd_ptr не было, то эта операция просто ничего не сделает вообще - как были нули в старших битах разности, так и останутся. Если ошибка была - то %BUFFER_SIZE заметёт её под коврик и она вылезет в другом месте.
А твой вариант "для оригинального варианта" (совсем, кстати, неэквивалентно % BUFFER_SIZE):
Для ulong wr_ptr и rd_ptr wr_ptr-rd_ptr равно как и -rd_ptr+wr_ptr - всегда неотрицательно. Итого в вети else у тебя выходит, например
Код
wr_ptr = 0;
rd_ptr = 0xFFFFFFFF;
// правильный size == 1
// у тебя выйдет BUFFER_SIZE+1
Можешь проверить на бумажке с
любым порядком суммирования в выражении
size = BUFFER_SIZE - rd_ptr + wr_ptr;
Цитата(starter48 @ Oct 27 2005, 14:52)
консенсус?

Хорошо, давай тогда так. Сначала забудем про размер буфера вообще.
Код
ulong full_size, wr_ptr, rd_ptr;
full_size = wr_ptr - rd_ptr; // всё, тут ПРАВИЛЬНАЯ длина
Претензии есть?
Теперь надо или
Код
uint size;
// параноидальній вариант
if( full_size > BUFFER_SIZE) big_error();
else size = (uint)full_size; // просто отбрасываем ГАРАНТИРОВАННО нулевые биты
// независимо от того - BUFFER_SIZE = 1K или 64К
или не выделываться и
Код
// нормальній вариант
size = (unit)full_size;
//т.е.
size = wr_ptr - rd_ptr;
Для тех, кто в танке. Возьмите листик в клеточку, пусть wr_ptr rd_ptr будут 6-битные, size - 3-битный а буфер на 4 ячейки (т.е. меньше, чем может дать size).
И порисуйте картинки. Всё честно.
Варианта обработки может быть два - указанные мной как параноидальный и как нормальный. Визнетовский не подходит ни под один из них (реально он
эквивалентен нормальному), он больше похож на результат плясок с бубном, когда одновремённо с ударом рукой по бубну (тот if-else) задели ещё что-то ногой (например, какую-то переменную со знаковой переделали в беззнаковую) и оно заработало. Дальше не анализировали и не трогали.
Сообщение отредактировал ReAl - Oct 28 2005, 05:21