суббота, 9 марта 2013 г.

NXT-G: досрочный выход из MyBlock

Возможность создания собственных блоков (MyBlock) в среде NXT-G - достаточно мощный инструмент написания понятных и компактных программ. Можно передавать данные в такой блок и поучать результаты выполнения блока - это делает их применимыми для решения широкого круга задач.
Одни и те же собственные блоки могут использоваться в разных программах. А значит, написанные и доведенные до совершенства только один раз, их можно вставлять в разные программы в течение многих лет.

Тем не менее собственные блоки обладают рядом недостатков, с которыми приходится сталкиваться программистам. Один из таких недостатков невозможность выйти из собственного блока досрочно.

Часто бывает необходимо досрочно выйти непосредственно из блока, а не из всей программы. Например, если в ходе работы блока обнаружилась ошибка или выяснилось, что часть действий не нужно выполнять. В данном случае использовать блок "Остановка"/"Stop" некорректно - хотя работа блока и остановится, но также остановится и вся программа.


Чтобы рассмотреть несколько способов решения данной задачи, для наглядности, будем рассматривать некоторый блок do_action, который состоит из набора действий action_1, action_2 и action_3. Хотя на схеме программы наборы действий action_1, action_2 и т.п. выглядят тоже как MyBlock - это сделано лишь для того, чтобы абстрагироваться от других блоков, которые могут стоять на этом месте в реальной программе.


Необходимо придумать такой способ, чтобы блок do_action имел возможность завершиться после каждого набора действий action_X. В свою очередь это можно перефразировать как, например, наборы действий action_2, action_3 и action_4 не должны выполняться в определенном случае, после набора действий action_1.

Перефразировав задачу таким образом, сразу же напрашивается решение, когда перед наборами действий action_2/3/4 выполняется проверка, нужно ли выполнять их или нет. В проверке будет использоваться логическая переменная Exit - если ее значение True, то блок do_action должен прекратить свою работу. Подразумевается, что переменная Exit будет выставлена в False в начале блока do_action и затем, в одним из действий в набора action_1/2/3 она выставляется в True.


Естественно, используя блок разветвления со вкладками, программа станет значительно легче для чтения. Главное не забывать, что каждая "ветвь" отвечающая за True в блока разветвления - пустая.

Другой способ позволяет несколько сократить запись последовательности выполнения действий, но требует понимания базовых концепций автоматного подхода в программировании. Применительно к данной задаче, это будет обозначать, что каждый следующий набор действий будет выполняться в результате перехода автомата в следующее состояние. Причем, также будет существовать дополнительное состояние отвечающее за выход из блока (выход из цикла переключений состояний).


Чтобы выйти из цикла переключений состояний будет использоваться логическая переменная, которая будет выставляться в True, в ходе обработки сигнала a5. Сигнал a5 может посылаться, как результат любого из набора действий action_1/2/3. Следовательно, каждый набор действий должен включать посылку сигнала перехода к следующему набору действий или посылку сигнала выхода a5.

Например, набор действий action_1 может выглядеть следующим образом:


Весь цикл переключений состояний будет выглядеть тогда вот так:


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


Пятая вкладка в блоке разветвления будет содержать только один блок:


Следует отметить, что на самом деле обработка пятого сигнала в общем случае не нужна - просто вместо "посылки" сигнала a5 нужно сразу присваивать True переменной Exit подобно тому, как это сделано в action_4 (см. выше содержимое четвертой вкладки). Но в том подходе, который описывается выше, реализация оставлена именно такой, чтобы помимо выхода из цикла в этой обработке можно было бы сделать какие-то дополнительные действия, сигнализирующие об досрочном выходе из блока: подача звукового сигнала, вывод на экран, запись сообщения в файл или может просто остановка моторов.

А какие еще существуют способы реализации досрочного выхода из собственного блока?

Кстати, в новой среде программирования для набора LEGO Mindstorms EV3, как уже говорилось, существует специальный блок - досрочный выход из цикла. С его использованием досрочный выход из блока можно будет запрограммировать гораздо проще. Внутри блока будет располагаться цикл, выполняющийся всего одну итерацию, и поэтому блок досрочного выхода из цикла будет приводить к завершению всего блока целиком.

Комментариев нет:

Отправить комментарий

Related Posts Plugin for WordPress, Blogger...