Действительно ли нужны указатели функций для реализации FSM? - PullRequest
3 голосов
/ 01 декабря 2010

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

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

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

Ответы [ 3 ]

4 голосов
/ 01 декабря 2010

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

3 голосов
/ 01 декабря 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 при любых обстоятельствах, но я думаю, что это одна из реализаций, которая действительно использует ее довольно красиво.

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

2 голосов
/ 01 декабря 2010

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

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

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

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

...