Если у вас есть переменная CmdBuffTail
, указывающая на следующий элемент CommandBuffer
для записи, то:
void AddCmdToBfr(focusCommand *cmd)
{
assert(CmdBuffTail >= 0 && CmdBuffTail < CMD_BUFFER_SIZE);
CommandBuffer[CmdBuffTail++] = *cmd;
if (CmdBuffTail >= CMD_BUFFER_SIZE)
CmdBuffTail = 0;
}
Это сохраняет необходимый вам инвариант - индекс находится в диапазоне 0..CMD_BUFFER_SIZE-1.
Вам также может понадобиться отдельный индекс (возможно, CmdBuffHead
), чтобы определить, откуда читать. Если это так, вам, вероятно, потребуется изменить это значение в AddCmdToBfr()
, если CmdBuffTail
, если его догонит.
После исправления бессмысленного копирования входящей команды мне приходит в голову, что вам нужно тщательно подумать об управлении памятью. В этом случае ваша структура focususerCommand
достаточно проста (если только typedef CHAR
не скрывает указатель - в этом случае шлепки по запястьям; не скрывайте указатели), что вы можете просто безнаказанно копировать. Если вы не можете просто скопировать структуру (поскольку она содержит указатели на выделенную память), вам необходимо убедиться, что вы понимаете, кому принадлежат данные, чтобы убедиться, что (a) любая выделенная память освобождена , и (б) любая выделенная память освобождается только один раз . Это будет означать, например, что вместо простого копирования новой команды поверх старой, вам придется сначала освободить память, выделенную для старой записи. Думайте в терминах C ++ конструкторов и деструкторов копирования - в C.