如何在C中向结构数组中添加struct?

时间:2011-01-11 14:55:05

标签: c arrays struct

好的我有一个结构定义为......

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

我正在尝试创建一个函数,将这种类型的结构的实例添加到一个focuserCommands数组中。数组定义如下......

extern focuserCommand CommandBuffer[CMD_BUFFER_SIZE];

我尝试编写的函数应该指向focuserCommand并将其添加到CommandBuffer。我正在实现CommandBuffer作为FIFO环缓冲区,所以我知道我需要移动尾部forwared,以便我的其他函数可以看到缓冲区包含数据。 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 个答案:

答案 0 :(得分:1)

假设你有变量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中更改该值。


修复goof复制传入命令后,我发现你需要仔细考虑内存管理。在这种情况下,你的CHAR结构很简单(除非typedef {{1}}隐藏指针 - 在这种情况下,拍手腕;不要隐藏指针)你可以简单地复制它而不受惩罚。如果你不能简单地复制结构(因为它包含指向已分配内存的指针),那么你需要确保你了解谁拥有数据以确保(a)任何分配的内存 被释放, (b)任何已分配的内存仅在一次时释放。例如,这意味着不必仅仅将旧命令复制到旧命令上,而是必须首先释放分配给旧条目的内存。考虑C ++拷贝构造函数和析构函数 - 在C。