Обновить

Но почему, почему, почему был светофор зеленый?

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели14K
Всего голосов 6: ↑4 и ↓2+5
Комментарии16

Комментарии 16

Диалоги с формами сверстаны моё почтение, любо дорого смотреть, простите очень бросилось в глаза.

Их похоже тоже deepseek верстал

DeepSeek приложился только к созданию "типичного" варианта. Оно, кстати, доступно на GitHab - е. Вот там все его - от кода до формы web-странички.

Остальное, поверьте, все натуральное :)

а может надо было просто объяснить что это за черная магия с LArc? Или это специально, с целью всех запутать, типа у нас тут: "автоматная технология параллельного программирования", попробуй разберись?

Объяснял и не раз. Удивляет только, что находятся те, для которых это все еще "магия". LArc - класс для кодировки (создание некой структуры) одного перехода (дуги) конечного автомата: LArc("текущее состояние", "следующее состояние", "условие перехода", "действия при переходе в новое состояние"). Вот и все волшебство. И совсем не "черное" ;)

а можно пальцем ткнуть откуда берутся Y-ки (игреки y5, y6, y4), например такие:

    else if (nCounter == 45) { y5(); }
    else if (nCounter == 46) { y6(); }
    else if (nCounter == 47) { y5(); }
    else if (nCounter == 48) { y6(); }
    else if (nCounter == 49) { y5(); }
    else if (nCounter == 50) { y4(); }

Если не секрет?

Да какой же тут секрет - наследуются от родителя - базового класса. Там они и находятся.

Так я не могу найти! Где в базовом классе? Я вижу эти УУ-игреки в строках передаются, в списке инициализации:

    LArc("G0",	"G1","--","y5y10"),		//R=0, Y=0, G=0, 1 sec
    LArc("G1",	"G01","--","y6y10"),	//R=0, Y=0, G=1, 1 sec
    LArc("G01",	"G10","--","y5y10"),	//R=0, Y=0, G=0, 1 sec

А как они в функции превращаются я что-то не вижу или не понимаю. Можете пояснить, ну , или пальцем ткнуть если я что-то в упор не вижу?

Это все виновато ООП :).

Дело в том, что наш базовый класc имеет свой базовый класс - автоматный класс LFsaAppl, который лежит в самом низу иерархии любого автоматного класса. Т.е. в нашем случае так: LFsaAppl<-FTrafficLights<-FLightCntrl (в другом варианте FLifhtEasy). LFsaAppl имеет виртуальные функции - те самые x-сы и y-ки. Последние уже перегружаются реальными функциями в дочерних классах. Ядро интерпретации из таблицы переходов (те самые структуры LArc) определяет какие x-сы, а затем и какие y-ки (если есть ситуация перехода) запускать.

Вот как-то так грубо и на пальцах. Но есть исходные коды на С++ из которых все это "вычисляется" конкретно. Но надо, конечно, знать и С++ и, конечно, понимать принципы ООП. Хотя по большому счету достаточно понимать на уровне "как есть".

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

Так если вам (нам) нужна новая функция y555() и она у нас почему то должна быть виртуальная, получается мы должны где то в дебрях LFsaAppl<-FTrafficLights<-FLightCntrl (в другом варианте FLifhtEasy) написать эту функцию, потом перегрузить (я раньше думал что виртуальные функции надо переопределять, а не перегружать) реальными функциями в дочерних классах? Вам не кажется что это какая-то странная концепция, если только это не концепция "всех запутать"?

Да, нет, конечно. Просто всегда есть определенные ограничения. В данном случае с y555() будут проблемы. Речь, конечно, о классе LFsaAppl. Здесь ограничения даже на имена. Но Вы можете создать свой базовый автоматный класс и как-то решить эту проблему. Я уж как-то привык, если честно. Главное, не вызывает каких-то проблем. Да и зачем ломать то, что давно работает и работает надежно и эффективно.

LArc("текущее состояние", "следующее состояние", "условие перехода", "действия при переходе в новое состояние")

Т.е. эту строку можно записать в виде графики (функциональной модели нотации idef), как:

LArc -- внутри черного ящика, на левую грань которого давит AsIs, а на крышку ящика давит "условие перехода", подпираемое снизу пола ящика "действием при переходе в новое состояние" и, в конечном счёте, заканчивающееся выталкиванием с правой стороны стенки ящика на ТоВе (следующее состояние)?

Я правильно интерпретировал Вашу строку?

ЗЫ: сорян, вопрос от диназавров -- просто кайфую от светофора

Скорее нет, чем да. Это все же разные языки. Даже в смысле графики. Попробуйте любой автомат (граф переходов) изобразить в нотации idef и тогда все будет ясно. Когда-то я такие попытки делал. Безуспешно ;) Но, может, у Вас это получится.

Но на структурном уровне для описания сети автоматов эта нотация возможно и подойдет. Но в любом случае правильнее было бы сравнить сначала нотации UML и idef, а уж потом подбираться к более мелкой сущности - описанию переходов автомата.

Да. Через Вас вышел на статью Конечный автомат (FSM) — ловушка для программиста. Что можно сказать? Просто не нахожу слов. Действительно, - ловушка. ;)

Всё усложнено. Можно было в одном цикле всё сделать без всяких автоматов.

Можно, конечно. Но как говаривал один экземпляр - "можно, но зачем?". Здесь важно понимать - зачем. Можно проще - на лошади, на велосипеде или просто пешком. Другие варианты - машина, самолет или даже ракета. Несколько сложнее. Но дело в том, что появляются/открываются другие возможности.

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

Понятно, что у "сложных вариантов" и возможностей гораздо больше. А по-большому счету даже проще, чем пешком - сиди, да рули :)

по мотивам статьи Конечный автомат - ловушка для программиста

Это исходная программа:

tablRec =  Table.firstRec();
while(true)
{
         setLampsState(tablRec.colors);
         timer  = setTimer(tablRec.period);
         waitFor(timer);
          tablRec = nextRec(Table);
         if(tablRec == 0)
                  tablRec =  Table.firstRec();
}

 А это эквивалентный ей автомат:

bool x1()  { return timer; }

bool x2(){ return tablRec == 0 }

y1()  { tablRec =  Table.firstRec();}

y2(){ setLampsState(tablRec.colors); }

y3(){ timer  = setTimer(tablRec.period); }

y4(){ tablRec = nextRec(Table); }

 

“s1”, “s2”, “-”, y1,

“s2”, “s3”, “-”, y2y3,

“s3”, “s3”, “x1”, -,

“s3”, “s4”, “^x1”, y4,

“s4”, “s2”, “x2”, y1,

“s4”, “s2”, “^x2”, -.

Переход к автомату (КА) делается по щелчку. !00 лет формальной процедуре перехода от любой мудреной программы к КА. Так что для знающего КА не ловушка, а идеальная игрушка! Просто нужно хорошо знать матчасть. :)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации