basics · beginner · ~15 min
Implement finite state machine transitions safely using enums.
Finite state machines in embedded C commonly represent control states as explicit enum constants. Modeling valid transitions defends against invalid system states.
Given the state definitions:
typedef enum {
SIGNAL_RED = 0,
SIGNAL_GREEN = 1,
SIGNAL_YELLOW = 2,
SIGNAL_FLASHING_AMBER = 3
} TrafficSignal;
Implement:
TrafficSignal next_signal_state(TrafficSignal current, int emergency_override);
const char *signal_state_name(TrafficSignal s);
emergency_override != 0, transition immediately to SIGNAL_FLASHING_AMBER.emergency_override == 0):SIGNAL_RED transitions to SIGNAL_GREEN.SIGNAL_GREEN transitions to SIGNAL_YELLOW.SIGNAL_YELLOW transitions to SIGNAL_RED.SIGNAL_FLASHING_AMBER transitions to SIGNAL_RED.SIGNAL_RED.signal_state_name returns "RED", "GREEN", "YELLOW", "FLASHING_AMBER", or "UNKNOWN".next_signal_state(SIGNAL_RED, 0); // returns SIGNAL_GREEN
next_signal_state(SIGNAL_GREEN, 1); // returns SIGNAL_FLASHING_AMBER
current: TrafficSignal enum; emergency_override: int boolean flag.
Returns next TrafficSignal enum and state name string.
Zero dynamic allocations. Pure enum state logic.
typedef enum {
SIGNAL_RED = 0,
SIGNAL_GREEN = 1,
SIGNAL_YELLOW = 2,
SIGNAL_FLASHING_AMBER = 3
} TrafficSignal;
TrafficSignal next_signal_state(TrafficSignal current, int emergency_override) {
(void)current; (void)emergency_override;
return SIGNAL_RED;
}
const char *signal_state_name(TrafficSignal s) {
(void)s;
return "UNKNOWN";
}
Missing emergency check before normal transitions; string typos.
Override overrides any state; unknown input state defaults safely to RED.
Solve this exercise in the browser editor — compile and run against the test harness, no setup required.