2011-01-11 102 views
0

好吧,我有如何将结构添加到C中的结构数组?

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

假设你有变量CmdBuffTailCommandBuffer下一个元素指向被写入,那么:

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也许)来识别从哪里读取。如果是这样,如果CmdBuffTail赶上它,你可能需要更改AddCmdToBfr()中的值。


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

+0

我试过这个,但我得到一个编译器错误`CommandBuffer [CmdBuffTail ++] = cmd;`说在赋值中不兼容的类型。是因为cmd是一个指向结构体的指针而不是结构本身? – PICyourBrain 2011-01-11 15:03:31