Déplacement d’éléments dans un tableau

J’ai besoin d’un peu d’aide. Je souhaite décaler les éléments d’un tableau d’un élément vers le haut, de sorte que la nouvelle position 1 contienne l’ancienne valeur de la position 1, new-2 contient old-1, etc. L’ancienne dernière valeur est ignorée et la nouvelle valeur de la première position est une nouvelle valeur que je donne à chaque seconde.

J’utilise un tableau de taille 10:

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

Le code que j’utilise doit être exécuté toutes les secondes.

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

Ringbuffer réduit le nombre de copies de données. Si vous souhaitez que last_pos pointe sur l’échantillon le plus récent, vous l’augmentez avant la lecture.

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

Si le tampon doit restr continu et que le tampon de sonnerie ne le fait pas, alors memmove est l’option la plus simple:

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

où:

  • &TEST[1] est la destination du premier élément
  • &TEST[0] est le premier élément à déplacer
  • count est le nombre d’éléments à déplacer (maintenant 9)
  • sizeof(*TEST) est la taille d’un élément unique

Une autre façon de compter le nombre d’octets est sizeof(TEST) - sizeof(*TEST) , qui soustraira la taille d’un élément à la taille de l’ensemble du tableau. Cependant, cela ne fonctionnera que lorsque TEST est un tableau réel et non un pointeur (par exemple, un tableau transmis en tant qu’argument à une fonction décomposée en pointeur).