好的我有一个结构定义为......
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++;
}
答案 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。