Запись и чтение из eeprom массивов символов

Тема в разделе "Arduino & Shields", создана пользователем maks.dav, 1 май 2020.

  1. maks.dav

    maks.dav Нуб

    Имеется следующая задача:

    Есть шилд MEGA2560.

    Необходимо записать в память EEPROM несколько динамических массивов символов, затем их считать из EEPROM в массивы.

    Длина массивов первоначально неизвестна, поэтому они динамические с максимальным количеством элементов (в моём случае 20).

    Делается это для экономии оперативной памяти, т.к. работа идёт с большим количеством массивов.

    Запись и чтение происходит следующим образом:

    Код (C++):
    #include <EEPROM.h>
    char* str = "text";
    char* str1;
    char* str2;
    ...
    // Выделяем память для str1
    str1 = new char[20];
    // Вставляем какие-то данные
    str1[0] = 'a';
    str1[1] = 'b';
    str1[2] = 'c';
    // Запись в EEPROM str1
    EEPROM.put(address1, str1);
    // Освобождаем память от str1
    delete [] str1;
    // Запись в EEPROM str = "text" - статический массив символов
    EEPROM.put(address, str);
    *****************************************
    Перезагружаем контроллер
    *****************************************
    // Читаем из EEPROM в str1
    EEPROM.get(address1, str1); // Читает ерунду
    // Читаем из EEPROM в str2
    EEPROM.get(address, str2); // Читает нормально - str = "text"!..
     
  2. SergeiL

    SergeiL Оракул Модератор

    А где инициализация address и address1
    EEPROM адресный массив. Если вы хотите работать с динамическими массивами то нужно позаботиться о хранении информации о начале нового массива (его начальном адресе) и длинной массива. Варианты есть разные.
    Ну и плюс у вас str указывает на строку в памяти c нулем в конце.
    A str1 - это указатель и нет там строки.
     
    Последнее редактирование: 2 май 2020
  3. parovoZZ

    parovoZZ Гуру

    а чего её экономить? Занимай всю память и работай.