- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我有一个这样定义的结构......
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;
}
这保留了您需要的不变量 - 索引在 0..CMD_BUFFER_SIZE-1 范围内。
您可能还需要一个单独的索引(也许是CmdBuffHead
)来识别从哪里读取。如果是这样,如果 CmdBuffTail
catch 了它,您可能需要在 AddCmdToBfr()
中更改该值。
修复了复制传入命令的错误后,我发现您需要仔细考虑内存管理。在这种情况下,您的 focususerCommand
结构足够简单(除非 typedef CHAR
隐藏了一个指针 - 在这种情况下,拍拍手腕;不要隐藏指针),您可以简单地复制它而不受惩罚。如果您无法简单地复制该结构(因为它包含指向已分配内存的指针),那么您需要确保了解谁拥有该数据,以确保 (a) 释放任何已分配的内存, (b) 任何分配的内存仅释放一次。例如,这意味着您必须首先释放分配给旧条目的内存,而不是仅仅将新命令复制到旧命令上。从 C++ 复制构造函数和析构函数的角度思考 - 在 C 中。
关于c - 如何在 C 中将结构体添加到结构体数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4658908/
我是一名优秀的程序员,十分优秀!