2010-12-01 6 views
3

나중에 C 언어로 된 작은 FSM 구현을 제공하는 기사에서 http://www.netrino.com/Embedded-Systems/How-To/State-Machines-Event-Driven-Systems을 읽었습니다.FSM을 구현하기 위해 함수 포인터가 실제로 필요합니까?

나는 왜 그들이 함수 포인터를 선택했는지 이해하지 못합니다. 필자가 이해할 수있는 포인터는 동일한 인터페이스가 필요하지만 "이벤트"의 여러 유형 (예 : 일부 인터넷 프로토콜 패킷을 구문 분석하는 경우)에 유용합니다 (함수에 하나의 포인터를 등록하고 다른 함수를 파싱하는 것이 편리합니다 HTTP, 두 번째로 FTP를 구문 분석하는 등의 작업을 수행 할 수 있습니다.

하지만이 기사에서 볼 수있는 것은 아니며, 상태 머신 astraightforward 구현을위한 IMH가 충분하거나 틀렸을 수 있습니까?

답변

2

먼저이 게시판을 이해하는 것이 더 쉬운이 의견 this answer을 살펴보십시오.

둘째, 맞습니다. 함수 포인터는 동일한 "이벤트 패턴"에 대해 다른 동작을 구현하는 데 유용합니다. 이것은 OOP에서 일반적으로 다형성이라고 불리는 것입니다 (this wikipedia article을보십시오).

이렇게 생각하면 ... 이것은 FSM에 필요한 것입니다. 동일한 이벤트에 다른 방식으로 대응해야합니다. 즉, FSM의 각 상태 전환에 대해 다른 기능을 구현하는 것입니다.

언뜻보기에 "고전적인"switch 문으로 구현할 수 있지만 유연성과 기능 포인터 구현을 확장 할 수있는 기회는 장기적으로 당신에게 보상이 될 것입니다.

3

나는 그 기사가 약간은 틀렸다는 것을 인정할 것이다. 그러나 나는 여기

this post

#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의 사용을 망설 수있는 SNIPPIT가에서 나는 C에서 유한 상태 기계를 만드는 본 것 중 가장 쉽고 가장 우아한 방법 중 하나는 말할 것이다 어떤 상황에서도, 그러나 이것은 실제로 아주 아름답게 사용하는 하나의 구현이라고 생각합니다.

그래, 질문에 대답하기 위해 함수 포인터가 FSM에 과도하다고 생각할뿐만 아니라 코드를 혼란스럽게하는 경향이 있습니다.

+1

이것은 flex의 자동 생성 코드와 유사합니다. –

4

FSM을 구현하는 가장 간단한 방법은 함수 포인터를 사용하는 것입니다.
FSM에서 이벤트와 상태를 특정 동작과 연관시키는 매핑이 정의됩니다.
상태에 따라 동일한 이벤트를 다르게 처리해야합니다. 함수 포인터를 사용하는 것이 가장 적절합니다.
또한 쉽게 확장 할 수 있습니다. 새로운 비헤이비어를 추가하려면 새 기능을 추가하고 새 비헤이비어에 대한 매핑 테이블을 업데이트하기 만하면됩니다.
또한 확장되어 여러 개의 statemachines를 가질 수 있습니다.
FSM을 구현하는 다른 "해킹"이있을 수 있지만 함수 포인터는 표준화 된 접근 방식이라고 생각합니다.

관련 문제