如何在C中向结构数组添加结构?
好的,我有一个这样定义的结构如何在C中向结构数组添加结构?,c,arrays,struct,C,Arrays,Struct,好的,我有一个这样定义的结构 typedef struct { enum COMMAND command; enum CMD_SOURCE source; CHAR parameters[16]; } focuserCommand; 我试图创建一个函数,将这种类型的结构的实例添加到focuserCommands数组中。数组的定义如下 extern focuserCommand CommandBuffer[CMD_BUFFER_SIZE]; 我试图编写的函数应该使用指向
typedef struct
{
enum COMMAND command;
enum CMD_SOURCE source;
CHAR parameters[16];
} focuserCommand;
我试图创建一个函数,将这种类型的结构的实例添加到focuserCommands数组中。数组的定义如下
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++;
}
假设变量
CmdBuffTail
指向要写入的CommandBuffer
的下一个元素,那么:
void AddCmdToBfr(focusCommand *cmd)
{
assert(CmdBuffTail >= 0 && CmdBuffTail < CMD_BUFFER_SIZE);
CommandBuffer[CmdBuffTail++] = *cmd;
if (CmdBuffTail >= CMD_BUFFER_SIZE)
CmdBuffTail = 0;
}
void AddCmdToBfr(focusCommand*cmd)
{
断言(CmdBuffTail>=0&&CmdBuffTail=CMD\u缓冲区大小)
CmdBuffTail=0;
}
这将保留所需的不变量,即索引在0..CMD\u BUFFER\u SIZE-1范围内
您可能还需要一个单独的索引(CmdBuffHead
也许)来标识从何处读取。如果是这样,您可能需要在AddCmdToBfr()
IfCmdBuffTail
If中修改该值
在修复了复制传入命令的错误后,我突然想到,您需要仔细考虑内存管理。在这种情况下,您的
focususerCommand
结构足够简单(除非typedefCHAR
隐藏指针-在这种情况下,拍击手腕;不要隐藏指针),您可以简单地复制它而不受惩罚。如果不能简单地复制结构(因为它包含指向已分配内存的指针),则需要确保了解数据的所有者,以确保(a)释放任何已分配内存,(b)仅释放一次已分配内存。例如,这意味着,您必须首先释放分配给旧项的内存,而不是在旧项上复制新命令。考虑C++复制构造函数和析构函数——在C. 中我尝试过,但是在代码< >命令缓冲区[CMDBuffTe++]=CMD;代码>在分配中说出不兼容的类型。是因为cmd是指向结构的指针,而不是结构本身吗?@Jordan:我的错误-我忘了取消引用(复制)cmd
变量;我将其固定为CommandBuffer[CmdBuffTail]=*cmd代码>。道歉。