использование if-else вне функций

Dinosaur
Dinosaur аватар
Offline
Зарегистрирован: 01.01.2018

Добрый день, камрады

Столкнулся с затруднением. Зачада такова - в EEPROM храним настройки устройства (количество фаз, необходимость контроля температуры симисторов), эти значения могут быть изменены и сохранены через меню. При старте устройства необходимо считать значения этих переменных и в зависимости от их значений создать необходимое количество датчиков температуры. Внутри функции это сделал так (не пинайте за возможно нетрадиционно кривую реализацию - пока черновик):

_EEGET (settings, &settings_addr);                                                 // !!! считываем настройки устройства
    if bit_is_set(settings, SET_TRIAC_COOLING) {                                       // если включен котроль температуры симисторов
      if bit_is_set (settings, SET_3_PHASE) {                                          // если три фазы
        DS18B20_QTY = 4;                                                               // то датчиков температуры 4
      } else {                                                                         // если одна фаза
        DS18B20_QTY = 2;                                                               // то датчиков температуры 2
      }
    } else {                                                                           // если контроль температуры симисторов отключен
      DS18B20_QTY = 1;                                                                 // то датчик температуры 1
    }
  
    for (byte sensorNumber = 0; sensorNumber < DS18B20_QTY; sensorNumber++) {
      eeprom_read_block((void*)&DS18B20_num[sensorNumber], (const void*)&DS18B20_num_addr[sensorNumber], sizeof(DS18B20_num[sensorNumber]));
      if (sensorNumber == 0) {
        MicroDS18B20 sensor0(DS18B20_PIN, DS18B20_num[sensorNumber]);                            // Создаем датчики
      }
      if (sensorNumber == 1) {
        MicroDS18B20 sensor1(DS18B20_PIN, DS18B20_num[sensorNumber]);                            // Создаем датчики
      }
      if (sensorNumber == 2) {
        MicroDS18B20 sensor2(DS18B20_PIN, DS18B20_num[sensorNumber]);                            // Создаем датчики
      }
      if (sensorNumber == 3) {
        MicroDS18B20 sensor3(DS18B20_PIN, DS18B20_num[sensorNumber]);                            // Создаем датчики
      }
    }

Но проблема в том, что датчики созданы должны быть глобально, вне функций... А вне функций я не смог заставить работать условные операторы. #if #else тоже не сработали (как я понял, их можно использовать с определенными #define "переменными". Подскажите пути решения проблемы - не хочется занимать память лишними датчиками...

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

То что ты хочешь фундаментально неправильно. Сделай глобальный массив указателей размером с максимальное количество датчиков и заполняй его указателями экземпляры на куче.

sadman41
Offline
Зарегистрирован: 19.10.2016

Вместо массива - связный список, в нем - указатели на экземпляры класса "температурный датчик"

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

sadman41 пишет:
Вместо массива - связный список

Нет.  Не даст ничего связный список, если у тебя меньше сотни ячеек и не нужны конкатенации.

Dinosaur
Dinosaur аватар
Offline
Зарегистрирован: 01.01.2018

rkit пишет:

То что ты хочешь фундаментально неправильно. Сделай глобальный массив указателей размером с максимальное количество датчиков и заполняй его указателями экземпляры на куче.

Можете поподробнее (или ткнуть носом где доступно для новичков почитать можно)? А то я пока "ненастоящий сварщик - я маску на стройке нашел".

sadman41
Offline
Зарегистрирован: 19.10.2016

Даст или не даст - пусть решает ТС. Он просил указать путь.

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

почитать можно в учебнике по С++

b707
Offline
Зарегистрирован: 26.05.2017

Dinosaur пишет:

Можете поподробнее (или ткнуть носом где доступно для новичков почитать можно)? А то я пока "ненастоящий сварщик - я маску на стройке нашел".

смысл в том, что никакие операторы не могут размещаться вне функций и процедур. Таким образом, создать глобальные переменные по условию if-else невозможно. Но можно создать глобальную ссылку на обьект, а сам обьект создать в процедуре:

MyObject* objptr; //глобальный указатель на обьект типа MyObject

void setup() {

if (EEPROM[0] == 22) {  //если в первой ячейке ЕЕПРОМ нужное значение 

 objptr = new MyObject();  // создаем обьект с глобальной областью видимости 

}

благодаря тому, что указатель обьявлен глобально, обьект, на который он указывает - будет виден во всех частях программы, хотя и создан внутри процедуры setup()

Dinosaur
Dinosaur аватар
Offline
Зарегистрирован: 01.01.2018

b707 пишет:

смысл в том, что никакие операторы не могут размещаться вне функций и процедур. Таким образом, создать глобальные переменные по условию if-else невозможно. Но можно создать глобальную ссылку на обьект, а сам обьект создать в процедуре:

Большое спасибо - понятно и доступно, пошел применять.