C语言-状态机模式

发布时间 2023-06-06 23:50:05作者: Charles_hui

1.假设我们的交通信号灯控制器有以下三个状态:绿灯状态、黄灯状态和红灯状态。在绿灯状态下,我们可以选择进入黄灯状态或红灯状态。在黄灯状态下,我们等待一段时间,然后返回到红灯状态。

2.Code

点击查看代码
#include <stdio.h>
#include <unistd.h>

// 定义状态枚举类型
typedef enum {
    STATE_GREEN,
    STATE_YELLOW,
    STATE_RED
} State;

// 状态转移函数
State greenToYellow() {
    printf("Green -> Yellow\n");
    sleep(1); // 等待 1 秒钟
    return STATE_YELLOW;
}

State greenToRed() {
    printf("Green -> Red\n");
    return STATE_RED;
}

State yellowToRed() {
    printf("Yellow -> Red\n");
    return STATE_RED;
}

State redToGreen() {
    printf("Red -> Green\n");
    return STATE_GREEN;
}

// 状态转移函数数组
State (*stateTransitions[])(void) = {
    greenToYellow,
    greenToRed,
    yellowToRed,
    redToGreen
};

int main() {
    State currentState = STATE_GREEN;

    while (1) {
        printf("Current state: %d\n", currentState);
        currentState = stateTransitions[currentState]();
    }

    return 0;
}

3.详解
状态转移函数数组使用了函数指针数组,可参考如下使用方法

点击查看代码
int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int multiply(int a, int b) {
    return a * b;
}

int divide(int a, int b) {
    return a / b;
}

int (*mathFuncs[4])(int, int) = {add, subtract, multiply, divide};