Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中向结构数组添加结构?_C_Arrays_Struct - Fatal编程技术网

如何在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()
If
CmdBuffTail
If中修改该值



在修复了复制传入命令的错误后,我突然想到,您需要仔细考虑内存管理。在这种情况下,您的
focususerCommand
结构足够简单(除非typedef
CHAR
隐藏指针-在这种情况下,拍击手腕;不要隐藏指针),您可以简单地复制它而不受惩罚。如果不能简单地复制结构(因为它包含指向已分配内存的指针),则需要确保了解数据的所有者,以确保(a)释放任何已分配内存,(b)仅释放一次已分配内存。例如,这意味着,您必须首先释放分配给旧项的内存,而不是在旧项上复制新命令。考虑C++复制构造函数和析构函数——在C.

中我尝试过,但是在代码< >命令缓冲区[CMDBuffTe++]=CMD;代码>在分配中说出不兼容的类型。是因为cmd是指向结构的指针,而不是结构本身吗?@Jordan:我的错误-我忘了取消引用(复制)
cmd
变量;我将其固定为
CommandBuffer[CmdBuffTail]=*cmd。道歉。