在数组中移动元素

时间:2016-05-03 06:57:29

标签: c arrays stm32

我需要一些帮助。我想将数组中的元素向上移动一个元素,以便新位置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);
}

2 个答案:

答案 0 :(得分:3)

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);    
}

答案 1 :(得分:2)

如果缓冲区必须保持连续,并且ringbuffer不会,那么memmove是最简单的选项:

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

其中:

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

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