Как заново инициировать Структуру дефолтными значениями?
- Войдите на сайт для отправки комментариев
Чт, 04/08/2022 - 17:59
Добрый день, объявляю структуру для хранения настроек в хедере таким образом:
#define CHECKSTR "Settings" //проверка целостности
struct Settings {
int num=2;
int current=2000;
int max=255;
int min=0;
boolean st=false;
const String check = CHECKSTR;
};
Settings sets;
Далее в функции пытаюсь прочитать настройки из Епром в sets но если контрольная строка не совпадает - тогда сбрасываю обратно к значениям при инициализации.
void SettingsRead() {
EEPROM.begin(200);
EEPROM.get(100, sets);//читаем
if (sets.check != CHECKSTR) { //если проверочная строка не совпадает
Serial.println("settings corrupted.. set to defaults");
Settings sets; //это по идее должно заново проинициализировать глобальную переменную, но не работает
}
EEPROM.end();
}
Пытался также объявить внутри функции локальный экземпляр
Settings sets1;
И затем для сброса значений присвоить его глобальному экземпляру
sets=sets1;
это вызывает ошибку компиляции "use of deleted function 'Settings&..."
А вот такая конструкция присвоения:
Settings sets=set1;
компилируется, но на этом месте плата уходит в ребут каждый раз. Как правильно?
Да? Уверен?
да, вполне - этот фрагмент работает. Для записи использовал:
EEPROM.put(100, sets);
EEPROM.commit();
данные записались - в частности так записывал настройки вайфай - они считались и esp подключилась к роутеру.
Сделайте метод init и вызывайте его в конструкторе, а также тогда, когда надо.
Ммм. А можно узнать, как в твоей struct Settings закодированы настройки вайфая?
И не должно работать, память уже выделена и проинициализирована, причём на моменте компиляции (на сколько я понимаю).
Лучше сделать как Евгений Петрович написал.
И не должно работать, память уже выделена и проинициализирована, причём на моменте компиляции (на сколько я понимаю).
Память на стеке для глобальных переменных, а конструктор будет вызван, т.к. он не тривиальный.
И не должно работать, память уже выделена и проинициализирована, причём на моменте компиляции (на сколько я понимаю).
Память на стеке для глобальных переменных, а конструктор будет вызван, т.к. он не тривиальный.
Точно! Внутри функции сработает, но как функция отработает и переменная «сдохнет».
ТСу - лучше «чекай» чтение из еепром отдельной функцией, которая вернёт либо данные структуры (при удачном чтении), либо ноль при неудачном. Тогда при удачном - обновишь данные, при неудачном ничего делать не нужно.
ЕвгенийП
Благодарю, это оказался самый простой и действенный способ, так и сделал