MST

星途 面试题库

面试题:C语言函数指针在状态机中的应用

假设你正在设计一个简单的状态机,用于控制一个设备的不同运行状态(如初始化、运行、暂停、停止)。请使用C语言函数指针来实现状态转移逻辑,每个状态对应一个函数,当状态发生变化时,通过函数指针调用相应的状态处理函数。请给出完整的代码实现,并解释状态机如何通过函数指针实现状态转移。
30.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>

// 定义设备状态枚举
typedef enum {
    INITIALIZE,
    RUNNING,
    PAUSED,
    STOPPED
} State;

// 状态处理函数声明
void initializeState();
void runningState();
void pausedState();
void stoppedState();

// 函数指针类型定义
typedef void (*StateHandler)();

// 状态处理函数数组
StateHandler stateHandlers[] = {
    initializeState,
    runningState,
    pausedState,
    stoppedState
};

// 当前状态变量
State currentState = INITIALIZE;

// 状态转移函数
void transitionToState(State newState) {
    currentState = newState;
    stateHandlers[currentState]();
}

// 各个状态的处理函数实现
void initializeState() {
    printf("进入初始化状态\n");
}

void runningState() {
    printf("进入运行状态\n");
}

void pausedState() {
    printf("进入暂停状态\n");
}

void stoppedState() {
    printf("进入停止状态\n");
}

int main() {
    transitionToState(RUNNING);
    transitionToState(PAUSED);
    transitionToState(STOPPED);
    transitionToState(INITIALIZE);

    return 0;
}

状态机通过函数指针实现状态转移的解释

  1. 定义状态枚举:通过typedef enum定义了设备可能的状态,如INITIALIZERUNNINGPAUSEDSTOPPED
  2. 定义函数指针类型:使用typedef定义了一个函数指针类型StateHandler,它指向无参数无返回值的函数。
  3. 状态处理函数数组:创建了一个stateHandlers数组,数组中的每个元素都是一个函数指针,分别指向各个状态对应的处理函数。
  4. 状态转移函数transitionToState函数接受一个新的状态作为参数,将当前状态更新为新状态,并通过函数指针调用对应的状态处理函数。例如,当newStateRUNNING时,currentState被设置为RUNNING,然后调用stateHandlers[RUNNING],即runningState函数。
  5. 状态处理函数实现:每个状态处理函数,如initializeStaterunningState等,实现了该状态下设备的具体行为。在这个示例中,仅仅是打印进入相应状态的信息。
  6. 主函数测试:在main函数中,通过调用transitionToState函数来模拟状态的转移,展示状态机的工作过程。