gpt4 book ai didi

c - 如何在 C 中将结构体添加到结构体数组中?

转载 作者:行者123 更新时间:2023-11-30 16:02:54 25 4
gpt4 key购买 nike

好吧,我有一个这样定义的结构......

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com