Гражданская радиосвязь в России (CB, LPD, PMR) Вход     Регистрация

18+ Данный раздел сайта запрещён для просмотра детьми!  

Данный раздел запрещён для просмотра детьми

Материалы данного раздела могут содержать информацию, запрещенную для детей, согласно нормам установленным Федеральным законом "О защите детей от информации, причиняющей вред их здоровью и развитию".
Гражданская радиосвязь / Всё на форуме / Программирование: С, Arduino и другое - обсуждение, вопросы и ответы
А как C++ работает с подпрограммами?
4 из Новосибирск - Новосибирская обл
4 из Новосибирск - Новосибирская обл
  В arduino код пишется фактически в с++ с дополнительной обвязкой. МК при старте однократно отрабатывает void setup() и потом по кольцу гоняет код внутри void loop().

Возникает вот какого рода вопрос: а как с++ реагирует на вызов функций/подпрограмм которые вызывают одна из под другой? К примеру:
void blablabla()
{
некий код
bugaga()
}

void bugaga()
{
некий код
blablabla()
}
 
Записано: 3396 дн 7 час 45 мин 11 сек назад (10.12.2014, 09:18:01)

250 из Новосибирск - Новосибирская обл
250 из Новосибирск - Новосибирская обл
  Как правильно заметил Сержант, такой подход к программированию, как описал Четвёрыч, называется "рекурсия", иногда это полезно и позволяет чуть короче и читабельнее написать некий алгоритм, например: Библиотека примеров приложений Java - Рекурсивный обход дерева каталогов или другой пример: Вычисление факториала на C++

Если нужно просто кольцо, то рекурсия плохой, не годный метод, который кончится банальным переполнением стека, правильное "бесконечное кольцо" организуется так:

void setup(){
while(1){funkcyja_kotoruju_vsrgda_vyzyvaem();}
}
 
Записано: 3396 дн 5 час 2 мин 1 сек назад (10.12.2014, 12:01:11)

250 из Новосибирск - Новосибирская обл
250 из Новосибирск - Новосибирская обл
  А ещё в си есть и банальный "goto" который позволяет тоже организовывать колца:

void setup(){

idi_po_krugu:
funkcyja_kotoruju_vsrgda_vyzyvaem();
goto idi_po_krugu;

}

Подробнее можно прочитать здесь: Метки и GOTO
 
Записано: 3396 дн 4 час 58 мин 43 сек назад (10.12.2014, 12:04:29)

4 из Новосибирск - Новосибирская обл
4 из Новосибирск - Новосибирская обл
  Ре-ку-р-си-я. Вона чо... Теперь буду знать как называются мои костыли =)
а вот goto blabla это годный переход между кусками кода....
 
Записано: 3396 дн 4 час 6 мин 43 сек назад (10.12.2014, 12:56:29)

250 из Новосибирск - Новосибирская обл
250 из Новосибирск - Новосибирская обл
  Немного оффтопика.

Вообще по коду нечего ходить просто так.
При написании программ для микроконтроллеров я обычно использую модель, которую можно назвать:
"одно событие - одно действие"
выглядит это примерно так:
+ На пины на которые повешу кнопки я врубаю прерывания, когда нажимается кнопка вызывается прерывание, которое обрабатывает это нажатие.
+ Переодическите события, которые должны скажем происходить каждые NNN раз в секунду вызываются из прерываний таймеров.
+ События вида "приём байта в USART" тоже вызываются установленными прерываниями.
В сухом остатке в main() - то же самое что setup() в ардуион у меня валяется код вида:
while(1){
#asm("sleep") // перейти в спящий режим (выход из него происходит по прерываниям)
}
хотя могу устраивать и фокусы с глобальными флажками, когда в функции обрабатывающей прерывание есть участок кода вида:
flag_gneva=1;
а в цикле в main код вида:
while(1){
#asm("sleep") // перейти в спящий режим (выход из него происходит по прерываниям)
if (flag_gneva == 1){
funkcija_gneva();
flag_gneva=0;
}
}

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

И вообще, заканчивай с ардуионо, давай кодь на сях, вот начнётся 3-я мировая пригодится же!
 
Записано: 3395 дн 23 час 13 мин 55 сек назад (10.12.2014, 17:49:17)



 
Ник:

Пароль к нику:

Число изображённое крупным шрифтом:


Написать комментарий:
[B] [I] [S] [WWW] [YouTube]

Бросить друзьям ссылку на тему:
Если это интересная тема, дайте людям на неё ссылку:
http://27kb.ru/zou.php?f=901&message=20282


О сайте
Правила сайта
  Обратная связь Рекламодателям
  Сотрудничество   Яндекс.Метрика