Как добавить структуру в массив структур в C? - PullRequest
0 голосов
/ 11 января 2011

Хорошо, у меня есть структура, определенная как таковая ...

typedef struct
{
    enum COMMAND command;
    enum CMD_SOURCE source;
    CHAR parameters[16];
} focuserCommand;

Я пытаюсь создать функцию, которая добавит экземпляр этого типа структуры в массив focusserCommands. Массив определяется следующим образом ...

extern focuserCommand CommandBuffer[CMD_BUFFER_SIZE];

функция, которую я пытаюсь написать, должна взять указатель на focuserCommand и добавить его к CommandBuffer. Я реализую CommandBuffer в качестве кольцевого буфера FIFO, поэтому я знаю, что мне нужно переместить хвост, чтобы мои другие функции могли видеть, что буфер содержит данные. CmdBuffHead и CmdBuffTail представляют указатели чтения и записи буфера. Письма добавляются к хвосту, чтения производятся с головы.

void AddCmdToBfr( focuserCommand * cmd )
{
// What goes here to add the struct pointed to by cmd to 
    //   element CmdBuffTail of the buffer?

    CmdBuffTail++;
}

1 Ответ

1 голос
/ 11 января 2011

Если у вас есть переменная 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...