Разбиение программы на подпрограммы

nefktn500

✩✩✩✩✩✩✩
12 Окт 2020
3
0
Доброго всем времени суток. Я только начал изучать программирование на С++, в частности решил начать это делать на платформе Ардуино. Столкнулся с такой проблемой, ответа на которую не смог найти на просторах интернета (скорей всегда ввиду неверной постановки вопроса при поиске): как разбить простую, но объемную программу на подпрограммы? В голове (неопытного в программирование человека) вижу это так: основной код (банально управление выбором 1 из подпрограмм) и от него есть ссылки на сразу готовую программу/библиотеку/еще что-то. Т.е. я грубо говоря выбрал с помощью механических переключателей 1 из подпрограмм/режим/номер микросхемы, подтвердил, ардуино поняла что я выбрал эту программу и начала ее воспроизводить. Программа, повторюсь достаточно простая для моего опыта, но объемная и строчек кода в случае написания "в лоб" будет ну очень много. Не прошу от вас готового решения, а лишь помощи в терминах, как подобное правильно называется, варианты решения задачи и, если кому не сложно, примеры подобного. Спасибо всем за помощь!
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Открой любой пример из проектов Алекса Гайвера. Хороший пример разбития по-гайверовски это теплица. Там все действия разбиты по функциям.

Вот кусок из беты 1.5
C++:
void loop() {
  customLoop();       // вызов блока своих функций (вкладка custom)

  checkPID();         // пересчёт регулятора
  backlTick();        // таймер неактивности подсветки
  debTick();          // таймер неактивности дисплея
  controlTick();      // управление
  plotTick();         // суточные графики
  readAllSensors();   // опрос датчиков

  driveTick();        // работа привода

#if (SERVO1_RELAY == 0)
  servo1.tick();      // здесь происходит движение серво по встроенному таймеру!
#endif
#if (SERVO2_RELAY == 0)
  servo2.tick();      // здесь происходит движение серво по встроенному таймеру!
#endif

  if (currentChannel == -3) {         // если СЕРВИС
    serviceTick();
  } else {  // если ОТЛАДКА или НАСТРОЙКИ
    if (millis() - commonTimer > 1000) {
      commonTimer = millis();
      timersTick();
      if (currentChannel == -1) {
        if (debugPage == 0) redrawDebug();
        else redrawPlot();
      }
    }
  }

#if (WDT_ENABLE == 1)
  wdt_reset();        // пинаем собаку
#endif
}
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
357
564
@nefktn500, это очень плохой пример, потому что программа разбита не на подпрограммы, а на функции. Это все ещё одна программа! Тебе нужен вот этот урок

Более простой вариант - разделение на функции, как написали выше, урок максимально подробный со всякими трюками вот он https://alexgyver.ru/lessons/how-to-sketch/
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Ну а что такое подпрограммы ?
Это пример больше для структурирования программы, для удобства использования. Что в общем то и надо.
ООП конечно хорошо, но не всегда его надо использовать. И не все его сразу понимают.
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
357
564
@Старик Похабыч, любой нормальный программист схватится за голову, увидя наваленные в кучу глобальные переменные и винигрет из всего остального) но новичку ничего другого изобразить и не получится
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,159
1,267
Москва
Так вот ко всему и надо подходить постепенно. Сначала куча, потом порядок и функции, потом объекты, когда все функции в голове уложатся.

Чем твои коды хороши - в них легко разобраться, они логичны, если надо что то подправить, то с пол пинка в основном. Пусть учатся. Но контроллер теплицы к ним не относиться, это просто у меня было скачано, не рыться же что бы найти :D
 

nefktn500

✩✩✩✩✩✩✩
12 Окт 2020
3
0
Alex, спасибо за ссылки, да и за уроки тоже. Не знаю почему не обратил на них внимание при их просмотре, но скорей всего быстрее хотел ворваться в дело и начать возиться (и тонуть в том числе) напрямую с кодом, решая проблемы по ходу дела=)
 

Ari_McLaven

✩✩✩✩✩✩✩
23 Янв 2020
6
0
Здравствуйте, у меня возник вопрос о передаче из функции нескольких однотипных переменных, делаю таймер на ST7735, нужно чтоб функция возвращала 3 порядковый номера(по сути число i для каждого цикла) день недели, час и минута, с одним числом типа float получаеца, но не хочеца тратить ресурсы на обратный пересчёт какой это день недели, час и минута
 

kDn

★★★★★✩✩
18 Ноя 2019
1,109
437
Спасибо, но для начала про структуры изучу
Сначала про указатели и ссылки почитайте, а то ведь ваша задача может свестись к чему-то типа:

C++:
void foo(int *param1, int *param2, int *param3){
    *param1 = 123;
    *param2 = 234;
    *param3 = 345;
}

void main(){
    int a,b,c;
    foo(&a, &b, &c);
}
 
  • Лойс +1
Реакции: Roden

Ari_McLaven

✩✩✩✩✩✩✩
23 Янв 2020
6
0
Сначала про указатели и ссылки почитайте, а то ведь ваша задача может свестись к чему-то типа:

C++:
void foo(int *param1, int *param2, int *param3){
    *param1 = 123;
    *param2 = 234;
    *param3 = 345;
}

void main(){
    int a,b,c;
    foo(&a, &b, &c);
}
Мне вообще с самого начала надо по ссылке изучить, когда то изучая бэйсик и фортран немного разобрался благодаря видео урокам Алекса, но тут оказываеца глубже копать надо
 

kDn

★★★★★✩✩
18 Ноя 2019
1,109
437
Мне вообще с самого начала надо по ссылке изучить, когда то изучая бэйсик и фортран немного разобрался благодаря видео урокам Алекса, но тут оказываеца глубже копать надо
Ну вообще я имел в виду два типа - указатель и ссылка, хотя по сути ссылка это синтаксический сахар и обертка над указателем.
И то и другое позволяют менять значение переданного параметра. Тягать же через стек структуры идея плохая, т.к. расходует память, лучше опять же передавать указатель на структуру или ссылку на нее. Что приводит к тому, что как работают указатели и ссылки в любом случае знать надо, прежде чем переходить к структурам, классам и прочему.
 

Ari_McLaven

✩✩✩✩✩✩✩
23 Янв 2020
6
0
Ну вообще я имел в виду два типа - указатель и ссылка, хотя по сути ссылка это синтаксический сахар и обертка над указателем.
И то и другое позволяют менять значение переданного параметра. Тягать же через стек структуры идея плохая, т.к. расходует память, лучше опять же передавать указатель на структуру или ссылку на нее. Что приводит к тому, что как работают указатели и ссылки в любом случае знать надо, прежде чем переходить к структурам, классам и прочему.
Тут вообще программа строица по другому, потому с начала всё надо изучать, да и по ходу прочтения возникают вопросы, показан пример по объявлению переменных без указания типа, сразу возник вопрос к какому типу их запишет компилятор по умолчанию, но в статье об этом ни слова, но как вариант показан
 

Kir

★✩✩✩✩✩✩
28 Мар 2020
69
16
Доброго всем времени суток. Я только начал изучать программирование на С++, в частности решил начать это делать на платформе Ардуино. Столкнулся с такой проблемой, ответа на которую не смог найти на просторах интернета (скорей всегда ввиду неверной постановки вопроса при поиске): как разбить простую, но объемную программу на подпрограммы? В голове (неопытного в программирование человека) вижу это так: основной код (банально управление выбором 1 из подпрограмм) и от него есть ссылки на сразу готовую программу/библиотеку/еще что-то. Т.е. я грубо говоря выбрал с помощью механических переключателей 1 из подпрограмм/режим/номер микросхемы, подтвердил, ардуино поняла что я выбрал эту программу и начала ее воспроизводить. Программа, повторюсь достаточно простая для моего опыта, но объемная и строчек кода в случае написания "в лоб" будет ну очень много. Не прошу от вас готового решения, а лишь помощи в терминах, как подобное правильно называется, варианты решения задачи и, если кому не сложно, примеры подобного. Спасибо всем за помощь!
Эта задача по умному называется декомпозицией, это один из этапов разработки архитектуры программного обеспечения, если поискать по этому запросу, то можно найти кое-какой материал, но в них скорее всего не будет никакой конкретики, и даже может показаться набором очевидных или абстрактных рекомендаций типа: "определить, где будет проходить ось изменений и спроектировать ПО так, чтобы добавляя что-то новое не приходилось лезть в код, который уже написан, для этого модули ПО не должны иметь явных связей друг с другом."

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

Поэтому, если у вас нет так называемого ментора, то на первой итерации делайте так как умеете, постепенно углубляясь в данную тему, у вас будут формироваться более конкретные вопросы, на которые можно дать более конкретные ответы, тем самым вы сможете улучшить свой навык и код.
 
Изменено:

poty

★★★★★★✩
19 Фев 2020
2,956
886
Интересно, человек учится программировать на С++, а предлагаются методы обычного программирования. Смысл? "++"-ность и нужна, чтобы скрыть методы выполнения действий от логики выполнения программы.
 

bort707

★★★★★★✩
21 Сен 2020
2,859
850
показан пример по объявлению переменных без указания типа, сразу возник вопрос к какому типу их запишет компилятор по умолчанию,
Вы о каком примере речь ведете? В С/С++ не бывает "переменных без типа", поэтому и нет никакого "типа по умолчанию", это вы что-то напутали
 

Ari_McLaven

✩✩✩✩✩✩✩
23 Янв 2020
6
0
Вы о каком примере речь ведете? В С/С++ не бывает "переменных без типа", поэтому и нет никакого "типа по умолчанию", это вы что-то напутали
Действительно, дубль прочитал как имя, сразу стоило обратить внимание на отсутствие запятой.