Как заново инициировать Структуру дефолтными значениями?
- Войдите на сайт для отправки комментариев
Чт, 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 закодированы настройки вайфая?
И не должно работать, память уже выделена и проинициализирована, причём на моменте компиляции (на сколько я понимаю).
Лучше сделать как Евгений Петрович написал.
И не должно работать, память уже выделена и проинициализирована, причём на моменте компиляции (на сколько я понимаю).
Память на стеке для глобальных переменных, а конструктор будет вызван, т.к. он не тривиальный.
И не должно работать, память уже выделена и проинициализирована, причём на моменте компиляции (на сколько я понимаю).
Память на стеке для глобальных переменных, а конструктор будет вызван, т.к. он не тривиальный.
Точно! Внутри функции сработает, но как функция отработает и переменная «сдохнет».
ТСу - лучше «чекай» чтение из еепром отдельной функцией, которая вернёт либо данные структуры (при удачном чтении), либо ноль при неудачном. Тогда при удачном - обновишь данные, при неудачном ничего делать не нужно.
ЕвгенийП
Благодарю, это оказался самый простой и действенный способ, так и сделал