ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
18 мая
220802
bialix (10.11.2010 13:35, просмотров: 5775)
линейные последовательные машины -- что и как? как большой фанат конечных автоматов я стараюсь все алгоритмы закодировать используя именно конечные автоматы, но часто встречаются задачи, когда собственно конечный автомат -- это ненужно. Конкретно: алгоритм установки связи с устройством: открыть COM-порт, послать приветствие, дождаться ответ, запросить конфигурацию, дождаться ответа, задать какие-то другие параметры, дождаться подтверждения, запросить состояние датчиков, дождаться подтверждения... короче очень линейный алгоритм, где после каждой команды мы ждем реакции и на основе такой реакции принимаем решение: идти ли дальше или делать аварийный останов. Поскольку все это очень линейно и никакого по сути ветвления не нужно (кроме проверки двигаться дальше или нет), то я для себя изобрел такое решение:
  • имеем массив пар указателей на функции: (action, reaction)
  • вместо state из конечных автоматов просто используем индекс массива, который инкрементируется после каждого успешного вызова reaction
  • action и reaction могут возвращать булевое значение true/false чтобы управлять продвижением по массиву
  • action -- это то, что мы делаем на очередном шаге; reaction -- обработчик ответа от дивайса
  • Если функции action и reaction затем записать друг за дружкой в сишном файле, то получаем более-менее понятную простыню как исполняется эта линейная последовательность. Вопросы к вселенскому разуму. Я собственно понимаю, что изобретаю велосипед, поэтому хотел бы полистать какую-то доступную теорию таких линейных автоматов (мне нужны ссылки на свободно доступные документы в сети). А также хотелось бы узнать о положительном опыте тех, кто подобное реализовывал. Напоследок скажу: описанный выше алгоритм уже опробован в реальном проекте и некоторый опыт работы с ним имею. Из недостатков могу отметить то, что функции action/reaction немного получаются сами по себе, поэтому если надо описать несколько похожих алгоритмов, то начинаешь переиспользовать функции для разных последовательностей, как следствие "последовательная простыня" разрушается, ибо копи-пастить вредно и неинтересно. Хочется верить (лучше знать), что подобный подход в принципе применим для описания линейных последовательностей в количестве больше одной штуки. Посему и спрашиваю помощи зала.