Saltar al contenido

Máquinas de estado en C

Puede que se de el caso de que halles algún problema con tu código o proyecto, recuerda probar siempre en un entorno de testing antes aplicar el código al proyecto final.

Solución:

Me gusta el enfoque de los saltos cuánticos.

El estado actual es un puntero a una función que toma un objeto de evento como argumento. Cuando ocurre un evento, simplemente llame a la función de estado con ese evento; Luego, la función puede hacer su trabajo y hacer la transición a otro estado simplemente configurando el estado en otra función.

P.ej:

// 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;

Los marcos QL proporcionan ayuda para cosas adicionales como acciones de entrada/salida/inicio, máquinas de estado jerárquico, etc. Recomiendo encarecidamente el libro para una explicación más profunda y una buena implementación de esto.

La mejor manera es en gran medida subjetiva, pero una forma común es usar un enfoque “basado en tablas” en el que asigna códigos de estado (enumeraciones o algún otro tipo integral) a punteros de función. La función devuelve su próximo estado y otros datos asociados y recorre esto hasta que se alcanza el estado terminal. De hecho, esto podría ser lo que está describiendo como su enfoque anterior.

Ese es más o menos el enfoque estándar. Si está interesado en estudiar una biblioteca bien considerada y comparar detalles, eche un vistazo a Ragel:

Ragel compila máquinas de estados finitos ejecutables a partir de lenguajes regulares. Ragel apunta a C, C++, Objective-C, D, Java y Ruby. Las máquinas de estado de Ragel no solo pueden reconocer secuencias de bytes como lo hacen las máquinas de expresiones regulares, sino que también pueden ejecutar código en puntos arbitrarios en el reconocimiento de un lenguaje regular. La incrustación de código se realiza mediante operadores en línea que no interrumpen la sintaxis del lenguaje normal.

Agradecemos que quieras asistir nuestro quehacer añadiendo un comentario y dejando una puntuación te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *