Всем привет. Не особо упоротый программист, однако как хобби.
В общем понадобились в проекте такие типы данный С++ как "struct". В общем посмотрите на две реализации - одна работает, а другая нет (просто не компилируется).
- работающая версия
- стандартная, но не работающая версия
В чем разница? С точки зрения логики там одно и тоже.
Сначала по второму варианту (стандартному).
Во втором, стандартном варианте, объявляем структуру "config" в области видимости выше чем setup и loop, и там же создаем два объекта типа "config" - идея простая - надо обеспечить видимость в loop, ведь если сделать это в setup, то в loop'е этих наших переменных просто не будет, и как с ними работать?! Компиляция приводит к какой-то билибирде - пишет, что мол "error: 'c2' does not name a type(id, pin)". Замечу, что изменить структуры можно двумя способами:
1. сразу инициализировать используя { a, b, c,....} (фигурные скобки c перечислением значений) - что не есть изменение(!), или 2. заполнять через точку. Так вот заполнение/изменение через "." (точку) не работает во втором случае. Однако, изменять/заполнять эти структуры в setup через точку получается, не ругается. НО тогда не получается работать с ними в loop.
В общем, решение такое. Функции setup и loop - это обязательные функции, которые выполняются сначала один раз setup, потом бесконечно loop. Ну тогда нам просто надо чтобы до loop выполнение просто не дошло. Первичные установки, настройки делаем в setup, а потом пишем цикл через while(1){...}. В этом цикле пишем весь наш основной рабочий код, точно также как это делается в loop. Цикл будет выполняться всегда, бесконечно, точно также как loop, и управление уже не отдаст никому, ведь 1 - это всегда true, т.е. loop управление никогда не получит. Так вот в setup уже можно манипулировать со структурами без проблем. К тому же именно такая логика , как оказалось, используется при программировании микроконтроллеров в чистом С/C++ (без фреймворка Arduino). Там нет функции типа setup, но обязательна функция int main(){/* код программы */ return 0; }, которая выполняется постоянно перезапускаясь, как loop (точнее loop как main). Объявление и первичная инициализация переменных там происходит перед main(), и проблем со struct там нет.
Что делает фреймворк Ардуино с исходным кодом (скетчем), мне не понятно, но явно какую-то пакость и ради чего?! Видимо ради того, чтобы было красиво: вот есть setup - пишите сюда настройки, вот есть loop - а сюда пишите основной код. А то что происходят непонятные вещи казалось бы с элементарными операциями (типа изменить значение одного из поля в struct) это как-то видимо пофигу.
В общем понадобились в проекте такие типы данный С++ как "struct". В общем посмотрите на две реализации - одна работает, а другая нет (просто не компилируется).
- работающая версия
- стандартная, но не работающая версия
В чем разница? С точки зрения логики там одно и тоже.
Сначала по второму варианту (стандартному).
Во втором, стандартном варианте, объявляем структуру "config" в области видимости выше чем setup и loop, и там же создаем два объекта типа "config" - идея простая - надо обеспечить видимость в loop, ведь если сделать это в setup, то в loop'е этих наших переменных просто не будет, и как с ними работать?! Компиляция приводит к какой-то билибирде - пишет, что мол "error: 'c2' does not name a type(id, pin)". Замечу, что изменить структуры можно двумя способами:
1. сразу инициализировать используя { a, b, c,....} (фигурные скобки c перечислением значений) - что не есть изменение(!), или 2. заполнять через точку. Так вот заполнение/изменение через "." (точку) не работает во втором случае. Однако, изменять/заполнять эти структуры в setup через точку получается, не ругается. НО тогда не получается работать с ними в loop.
В общем, решение такое. Функции setup и loop - это обязательные функции, которые выполняются сначала один раз setup, потом бесконечно loop. Ну тогда нам просто надо чтобы до loop выполнение просто не дошло. Первичные установки, настройки делаем в setup, а потом пишем цикл через while(1){...}. В этом цикле пишем весь наш основной рабочий код, точно также как это делается в loop. Цикл будет выполняться всегда, бесконечно, точно также как loop, и управление уже не отдаст никому, ведь 1 - это всегда true, т.е. loop управление никогда не получит. Так вот в setup уже можно манипулировать со структурами без проблем. К тому же именно такая логика , как оказалось, используется при программировании микроконтроллеров в чистом С/C++ (без фреймворка Arduino). Там нет функции типа setup, но обязательна функция int main(){/* код программы */ return 0; }, которая выполняется постоянно перезапускаясь, как loop (точнее loop как main). Объявление и первичная инициализация переменных там происходит перед main(), и проблем со struct там нет.
Что делает фреймворк Ардуино с исходным кодом (скетчем), мне не понятно, но явно какую-то пакость и ради чего?! Видимо ради того, чтобы было красиво: вот есть setup - пишите сюда настройки, вот есть loop - а сюда пишите основной код. А то что происходят непонятные вещи казалось бы с элементарными операциями (типа изменить значение одного из поля в struct) это как-то видимо пофигу.