State machines in C

前端 未结 9 1738
一整个雨季
一整个雨季 2021-01-30 07:34

What is the best way to write a state machine in C?
I usually write a big switch-case statement in a for(;;), with callbacks to re-enter the state machine when an external

9条回答
  •  无人共我
    2021-01-30 08:15

    I like the Quantum Leaps approach.

    The current state is a pointer to a function that takes an event object as argument. When an event happens, just call the state function with that event; The function can then do its work and transition to another state by just setting the state to another function.

    E.g.:

    // State type and variable, notice that it's a function pointer.
    typedef void (*State)(int);
    State state;
    
    // A couple of state functions.
    void state_xyz(int event) { /*...*/ }
    void state_init(int event) {
        if (event == E_GO_TO_xyz) {
            // State transition done simply by changing the state to another function.
            state = state_xyz;
        }
    }
    
    // main contains the event loop here:
    int main() {
        int e;
        // Initial state.
        state = state_init;
        // Receive event, dispatch it, repeat... No 'switch'!
        while ((e = wait_for_event()) != E_END) {
            state(e);
        }
        return 0;
    }
    

    The QL frameworks provides helpers for extra things like entry/exit/init actions, hierarchical state machines, etc. I highly recommend the book for a deeper explanation and good implementation of this.

提交回复
热议问题