Добавление новых данных в массив значений char - PullRequest
0 голосов
/ 25 февраля 2019

Я разрабатываю прошивку для ESP32, используя ESP-IDF и FreeRTOS.Я хочу преобразовать показание датчика в массив символов и сохранить его в энергонезависимой памяти.Когда берется новое чтение, оно должно быть добавлено в начало массива char, выдвигая более старые показания вправо.

Я делаю манипуляции с массивом следующим образом:

#define MAX_BYTES 100
char oldData[MAX_BYTES];
char newData[15];
sprintf(newData, "%.2f", Totalmass);
strcat(newData, ",");
int newlen = strlen(newData);
int looper = (sizeof(oldData) - newlen - 1);
for(int i = looper; i >= 0; i--)    {
    oldData[i + newlen] = oldData[i];
}
looper = strlen(newData);
for(int i = 0; i < looper; i++) {
    oldData[i] = newData[i];
}
printf("strlen final Data:\n", strlen(oldData));
printf("Final Data: %s\n", oldData);

Теперь перейдем к проблеме, с которой я столкнулся:

После того, как длина oldData превысит 100, т.е. MAX_BYTES, длина oldData будет равна 100 + длина самого нового чтения.При печати моего окончательного массива я вижу, что новейшие данные объединяются вперед (что желательно), но они также добавляются в конец массива.Вероятно, поэтому длина моих данных на MAX_BYTES превышает длину моих новейших данных.

ВЫХОД:

strlen final Data: 112
Final Data: -3129344.00,0.00,0.00,0.00,0.00,0.00,2796202.00,-8388604.00,133152.00,0.00,0.00,0.00,0.00,0.00,0.00,-3129344.00,

Если вы увидите вывод выше, длина превышает MAX_BYTES на 12Это длина последнего чтения, т. е. "-3129344.00".И эти данные появляются в массиве в начале, а также в конце массива.

  1. Почему происходит это нежелательное поведение?Кто-нибудь может заметить, что я делаю что-то не так?

  2. Этот вопрос только для моего любопытства.Почему массив не переполняется, даже если длина превышает его размер?Я заметил, что код зависал раньше, когда его размер превышал размер.

Заранее благодарен всем, кто проходит через мой вопрос!

...