Действительно ли указатели на функции нужны для реализации конечного автомата?

Я читал http://www.netrino.com/Embedded-Systems/How-To/State-Machines-Event-Driven-Systems далее в этой статье они предоставляют реализацию небольшого конечного автомата на языке C.

Не совсем понимаю, почему они выбрали указатели на функции. Насколько я понимаю, указатели на функции полезны, когда нужен один и тот же интерфейс, но для разных типов «событий», например, для анализа некоторого пакета интернет-протокола (удобно зарегистрировать один указатель на функцию и назначить ему разные функции, один для анализа HTTP, второй для анализа FTP и т. Д. Это всего лишь пример, но я думаю, вы поняли мою мысль).

Но это не то, что я вижу в статье, ИМХО для конечного автомата хватило бы прямой реализации, или может я ошибаюсь?


person Mark    schedule 01.12.2010    source источник


Ответы (3)


Сначала взгляните на этот этот ответ, то есть (на мой взгляд ) легче понять, чем тот, который вы разместили.

Во-вторых, вы правы: указатели на функции полезны для реализации различного поведения для одного и того же «шаблона событий». Это то, что обычно называется полиморфизмом в ООП (см. эту статью в Википедии) .

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

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

person Nova    schedule 01.12.2010

Самый простой способ реализовать FSM - использовать указатели на функции.
В FSM определено отображение, которое связывает событие и состояние с определенным поведением.
Таким образом, в зависимости от состояния одно и то же событие должно обрабатываться по-разному . Для этого лучше всего подходят указатели на функции.
Кроме того, он легко расширяется. Чтобы добавить новое поведение, вы просто добавляете новые функции и обновляете таблицу сопоставления для нового поведения.
Также он может быть расширен, чтобы иметь несколько машин состояний.
Я предполагаю, что могут быть другие "хаки" для реализации FSM, но указатели на функции - это стандартизированный подход.

person Cratylus    schedule 01.12.2010

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

Вот отрывок

#define FSM
#define STATE(x)      s_##x :
#define NEXTSTATE(x)  goto s_##x

FSM {
  STATE(x) {
    ...
    NEXTSTATE(y);
  }

  STATE(y) {
    ...
    if (x == 0) 
      NEXTSTATE(y);
    else 
      NEXTSTATE(x);
  }
}

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

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

person SiegeX    schedule 01.12.2010