Как заново инициировать Структуру дефолтными значениями?

Newby
Offline
Зарегистрирован: 22.03.2014

Добрый день, объявляю структуру для хранения настроек в хедере таким образом:

#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; 

компилируется, но на этом месте плата уходит в ребут каждый раз. Как правильно?

rkit
Offline
Зарегистрирован: 23.11.2016

Newby пишет:

  EEPROM.get(100, sets);//читаем
 

Да? Уверен?

Newby
Offline
Зарегистрирован: 22.03.2014

да, вполне - этот фрагмент работает.  Для записи использовал:

EEPROM.put(100, sets); 

EEPROM.commit();

 

данные записались - в частности так записывал настройки вайфай - они считались и esp подключилась к роутеру.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Сделайте метод init и вызывайте его в конструкторе, а также тогда, когда надо.

rkit
Offline
Зарегистрирован: 23.11.2016

Ммм. А можно узнать, как в твоей struct Settings закодированы настройки вайфая?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018
Settings sets; //это по идее должно заново проинициализировать глобальную переменную, но не работает

И не должно работать, память уже выделена и проинициализирована, причём на моменте компиляции (на сколько я понимаю).

Лучше сделать как Евгений Петрович написал.

rkit
Offline
Зарегистрирован: 23.11.2016

BOOM пишет:

И не должно работать, память уже выделена и проинициализирована, причём на моменте компиляции (на сколько я понимаю).

Память на стеке для глобальных переменных, а конструктор будет вызван, т.к. он не тривиальный.

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

rkit пишет:

BOOM пишет:

И не должно работать, память уже выделена и проинициализирована, причём на моменте компиляции (на сколько я понимаю).

Память на стеке для глобальных переменных, а конструктор будет вызван, т.к. он не тривиальный.

Точно! Внутри функции сработает, но как функция отработает и переменная «сдохнет».

ТСу - лучше «чекай» чтение из еепром отдельной функцией, которая вернёт либо данные структуры (при удачном чтении), либо ноль при неудачном. Тогда при удачном - обновишь данные, при неудачном ничего делать не нужно.

Newby
Offline
Зарегистрирован: 22.03.2014

ЕвгенийП

Благодарю, это оказался самый простой и действенный способ, так и сделал