移动数组中的元素

Posted

技术标签:

【中文标题】移动数组中的元素【英文标题】:Shifting elements in an array 【发布时间】:2016-08-28 02:47:13 【问题描述】:

我需要一点帮助。我想将数组中的元素向上移动一个元素,以便新位置 1 包含位置 1 的旧值,new-2 包含 old-1,依此类推。旧的最后一个值被丢弃,第一个位置的新值是我每秒给的一个新值。

我使用大小为 10 的数组:

uint32_t TEST[10] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;

我使用的代码必须每秒执行一次。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

    /* Code for shifting the elements */
    for (int i = 0; i < 9; i++) 
                    
       TEST[i+1] = TEST[i];
    
    TEST[0] = HAL_ADC_GetValue(&hadc);

【问题讨论】:

i &lt; 10 --> i &lt; 9 一个。不知道你问的是什么问题。湾。您需要将 for 循环和限制更改为 i &lt; 9,因为 9 + 1 超出了 TEST 的定义。 作为一个小提示,使用环形缓冲区可能更好。这样可以节省大量的复制指令。 @BLUEPIXY 是的,这应该是解决方案 你有什么问题? 您需要从 9 循环到 1 (含)。你的循环是用第一个元素覆盖每个元素。 【参考方案1】:

Ringbuffer 导致数据复制较少,如果您希望 last_pos 指向最新鲜的样本,则在读取之前增加它。

uint32_t TEST[10] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
int last_pos = 0; /* init to any valid number between 0 and 9 inclusively */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

    last_pos = (last_pos + 1) % 10;
    TEST[last_pos] = HAL_ADC_GetValue(&hadc);    

【讨论】:

【参考方案2】:

如果缓冲区必须保持连续,而环形缓冲区不行,那么memmove 是最简单的选择:

memmove(&TEST[1], &TEST[0], count * sizeof(*TEST));

地点:

&amp;TEST[1] 是第一个元素的目的地 &amp;TEST[0] 是第一个移动的元素 count 是要移动的元素数(现在是 9) sizeof(*TEST) 是单个元素的大小

计算字节数的另一种方法是sizeof(TEST) - sizeof(*TEST),它将从整个数组的大小中减去单个元素的大小。但是,这仅在 TEST 是一个实际数组而不是指针时才有效(例如,作为参数传递给函数的数组衰减为指针)。

【讨论】:

以上是关于移动数组中的元素的主要内容,如果未能解决你的问题,请参考以下文章

移动数组中的元素 C++

如何将numpy数组中的相同元素移动到子数组中

我的循环没有移动到数组中的下一个元素

Cuda将数组中的元素移动到末尾

已知一个数组,请将数组中的0移动到后面,非0元素保持原有秩序

将元素移动到数组中的第一个位置