Смещение элементов массива оставляет последние элементы пустыми

В настоящее время я работаю над проектом, в котором я усредняю ​​результаты последних 10-20 измерений. Для этого я сохраняю последние 10 значений в массиве. сдвиг вправо элементов для обновления данных.

Код, который я использую для сдвига значений:

void shiftvals() {
    memmove(&val[1], &val[0], (sizeof(val) / sizeof(val[0]))-1);
    for (unsigned int i = 0; i < (sizeof(val) / sizeof(val[0])); i++)
    {
        Serial.print(val[i]);
        Serial.print(",");
    }
    Serial.println();
}

Код, вызывающий функцию:

#define ARR_SIZE 10
uint16_t val[ARR_SIZE];

void loop(){
    Serial.print("Size of the array:\t");
    Serial.println(sizeof(val) / sizeof(val[0]));

    shiftvals();

    val[0] = (analogRead(A0));
}

Теперь проблема в том, что последние несколько выходных данных всегда будут равны 0, хотя массив хорошо заполняется. Когда я увеличиваю размер массива, количество пустых мест также увеличивается.

Выход:

396,396,381,462,503,195,0,0,0,0,
472,472,396,381,462,247,0,0,0,0,
495,495,472,396,381,206,0,0,0,0,
435,435,495,472,396,125,0,0,0,0,

Я серьезно запутался, что я делаю не так в memmove?

2 ответа

Решение

Проблема в вашем звонке в memmove. Ваш размер слишком короткий.

void shiftvals() {
    memmove(&val[1], &val[0], (sizeof(val) / sizeof(val[0]))-1);

    // that was only 9 bytes, but val[] is 20 bytes long.

    // ...
}

Должен прочесть

void shiftvals() {
    memmove(&val[1], &val[0], (ARR_SIZE - 1) * sizeof(val[0]));
    // ...
}

Сделайте это C++ способом:

#include <iostream>
#include <array>
#include <algorithm>

std::array<int,10> val = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

void shiftVals()
{
  std::rotate( begin(val), end(val)-1, end(val));
}

int main()
{
  shiftVals();
  for(auto v: val ) std::cout << v << " ";
  std::cout << "\n";
}

Не используйте глобальные переменные.

Другие вопросы по тегам