C:删除数组中的元素,并使以前的指针工作

C:删除数组中的元素,并使以前的指针工作,c,arrays,C,Arrays,我有几个这样的数组(请忽略特定的名称): 使用这些元素的代码,例如,coap_cmp_res[4](cmp5)与REST资源关联,称之为Res5 在某个时间点,我删除该数组中x位置的一个元素,如下所示: rest_deactivate_resource(&coap_cmp_res[x]); e.g. for x = 2 [cmp1,cmp2,0,cmp4,cmp5,0,0,0] 然后我想做的是再次使用这样的单个连续数组 e.g. [cmp1,cmp2,cmp4,

我有几个这样的数组(请忽略特定的名称):

使用这些元素的代码,例如,coap_cmp_res[4](cmp5)与REST资源关联,称之为Res5

在某个时间点,我删除该数组中x位置的一个元素,如下所示:

    rest_deactivate_resource(&coap_cmp_res[x]);
    e.g. for x = 2
    [cmp1,cmp2,0,cmp4,cmp5,0,0,0]
然后我想做的是再次使用这样的单个连续数组

e.g. [cmp1,cmp2,cmp4,cmp5,0,0,0,0]
我现在做的是:

for(UInt8 i = x; i < MAX_CMPS; i++){
    coap_cmp_res[i] = coap_cmp_res[i+1];
}
which gives [cmp1,cmp2,cmp4,cmp5,cmp5,0,0,0]
这看起来不错,但问题是Res5仍然与coap_cmp_res[4]相关联,因此现在的值是0,而不是cmp5,这不是我想要的

我可以停用和重新激活阵列中x之后的每个资源,使关联再次工作,但我想知道是否有更有效的方法来实现这一点。 希望这是有道理的。

正如谚语所说:“增加间接层次”。指向
coap\u cmp\u res
且稳定的
资源数组。然后将
Rea5
与指针关联,并使用间接方法进入有效条目

static resource_t  coap_cmp_res_data[MAX_CMPS];
static resource_t* coap_cmp_res_ptrs[MAX_CMPS]; // points into coap_cmp_res_data
删除元素时,更新
coap\u cmp\u res\u ptrs
中的条目,而不移动它们,并收缩
coap\u cmp\u res\u数据
。任何资源仍将引用
coap\u cmp\u res\u ptrs
中的相同位置,并且间接将其带到资源的当前位置

另一种方法是使用基于节点的存储,这种方法在您的情况下可能会更好(您必须对其进行分析)。也就是一个链表。

正如谚语所说:“添加一个间接层次”。指向
coap\u cmp\u res
且稳定的
资源数组。然后将
Rea5
与指针关联,并使用间接方法进入有效条目

static resource_t  coap_cmp_res_data[MAX_CMPS];
static resource_t* coap_cmp_res_ptrs[MAX_CMPS]; // points into coap_cmp_res_data
删除元素时,更新
coap\u cmp\u res\u ptrs
中的条目,而不移动它们,并收缩
coap\u cmp\u res\u数据
。任何资源仍将引用
coap\u cmp\u res\u ptrs
中的相同位置,并且间接将其带到资源的当前位置


另一种方法是使用基于节点的存储,这种方法在您的情况下可能会更好(您必须对其进行分析)。例如链表。

我真的不知道在数组中有什么更有效的方法,但如果您可以更改数据表示形式,也许链表可以做得更好。您不能将数组的最后一个元素放在刚刚创建的空闲位置,并更新对最后一个元素的所有引用?如果对每个元素只有一个引用,那么这会非常快…使用指针数组而不是值数组。然后你可以用相同的指针来表示其他变量,而不是指向数组元素。您仍然可以在最后一个编辑戳记上方的链接中看到帖子的编辑历史。我真的不知道在数组中有什么更有效的方法,但如果您可以更改数据表示形式,也许链表可以做得更好。你不能把数组的最后一个元素放在你刚刚创建的空闲位置,然后更新对最后一个元素的所有引用?如果对每个元素只有一个引用,那么这会非常快…使用指针数组而不是值数组。然后你可以用相同的指针来表示其他变量,而不是指向数组元素。您仍然可以在最后一个编辑戳记上方的链接中看到文章的编辑历史。@Sven-如果您对解决方案有疑问,请发布另一个问题。不要编辑这个。这是保持帖子整洁、有用和增加获得帮助机会的指南。@Sven-您可以从新帖子中添加一个链接以供参考,@Sven-如果您对解决方案有疑问,请发布另一个问题。不要编辑这个。这是保持文章整洁、有用和增加获得帮助机会的指南。@Sven-你可以在新文章中添加链接以供参考,
static resource_t  coap_cmp_res_data[MAX_CMPS];
static resource_t* coap_cmp_res_ptrs[MAX_CMPS]; // points into coap_cmp_res_data