You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中无goto语句实现带状态跳转的伪代码逻辑

无goto实现状态机的C++方案

核心思路

用状态枚举定义所有运行模式,主循环中维护当前状态变量,每个状态对应独立的处理函数——函数执行完当前状态的逻辑后,返回下一个要进入的状态,以此替代goto实现状态的切换与回溯。

实现步骤

  1. 定义状态枚举
    覆盖伪代码中所有状态场景:
enum class FlightState {
    Idle,
    LaunchWait,
    Launch,
    Descend,
    Landed,
    Simulation,
    Recovered
};
  1. 核心变量定义
    维护状态、命令、传感器数据等关键变量:
FlightState currentState = FlightState::Idle;
bool eepromFlag = false; // 从EEPROM读取的恢复标志
bool resetCommand = false;
bool calibrationCommand = false;
bool onCommand = false;
// 传感器数据
float altitude = 0.0f;
float prevAltitude = 0.0f;
  1. 状态处理函数
    每个状态对应独立函数,处理自身逻辑并返回下一个状态:

Idle状态处理

FlightState handleIdle() {
    // 检查EEPROM标志,跳转到恢复状态
    if (eepromFlag) {
        return FlightState::Recovered;
    }
    // 等待开机命令
    while (!onCommand) {
        readSerialCommands(); // 读取串口命令
    }
    return FlightState::LaunchWait;
}

LaunchWait状态处理

FlightState handleLaunchWait() {
    // 高度恒定判断(实际需加误差阈值)
    while (abs(altitude - prevAltitude) < 0.1f) {
        readSerialCommands();
        // 处理重置命令,返回Idle
        if (resetCommand) {
            eepromFlag = false;
            saveEepromFlag(); // 保存到EEPROM
            resetCommand = false;
            return FlightState::Idle;
        }
        // 处理校准命令
        if (calibrationCommand) {
            calibrateSensors();
            calibrationCommand = false;
        }
        sendTelemetry();
        prevAltitude = altitude;
        readAltitudeSensor(); // 更新当前高度
    }
    return FlightState::Launch;
}

Launch状态处理

FlightState handleLaunch() {
    // 高度上升中
    while (altitude > prevAltitude) {
        readSerialCommands();
        if (resetCommand) {
            eepromFlag = false;
            saveEepromFlag();
            resetCommand = false;
            return FlightState::Idle;
        }
        sendTelemetry();
        prevAltitude = altitude;
        readAltitudeSensor();
    }
    return FlightState::Descend;
}

Descend状态处理

FlightState handleDescend() {
    // 高度下降中
    while (altitude < prevAltitude) {
        readSerialCommands();
        if (resetCommand) {
            eepromFlag = false;
            saveEepromFlag();
            resetCommand = false;
            return FlightState::Idle;
        }
        // 仅执行一次释放操作
        static bool released = false;
        if (!released) {
            releaseHeatShield();
            releaseParachute();
            released = true;
        }
        sendTelemetry();
        prevAltitude = altitude;
        readAltitudeSensor();
    }
    return FlightState::Landed;
}

Landed状态处理

FlightState handleLanded() {
    // 高度恒定
    while (abs(altitude - prevAltitude) < 0.1f) {
        readSerialCommands();
        if (resetCommand) {
            eepromFlag = false;
            saveEepromFlag();
            resetCommand = false;
            return FlightState::Idle; // 直接返回Idle状态
        }
        makeBuzzerBeep();
        prevAltitude = altitude;
        readAltitudeSensor();
    }
    return FlightState::Landed;
}

Simulation状态处理

FlightState handleSimulation() {
    runSimulationStuff(); // 执行模拟逻辑
    return FlightState::Idle; // 模拟结束返回Idle
}

Recovered状态处理

FlightState handleRecovered() {
    loadRecoveredData(); // 加载恢复数据
    return FlightState::LaunchWait; // 恢复后进入等待发射状态
}
  1. 主循环逻辑
    初始化后进入无限循环,根据当前状态调用对应处理函数并更新状态:
int main() {
    // 系统初始化
    turnOnSystem();
    initializeSensors();
    eepromFlag = readEepromFlag(); // 从EEPROM读取标志
    readAltitudeSensor();
    prevAltitude = altitude;

    while (true) {
        switch (currentState) {
            case FlightState::Idle:
                currentState = handleIdle();
                break;
            case FlightState::LaunchWait:
                currentState = handleLaunchWait();
                break;
            case FlightState::Launch:
                currentState = handleLaunch();
                break;
            case FlightState::Descend:
                currentState = handleDescend();
                break;
            case FlightState::Landed:
                currentState = handleLanded();
                break;
            case FlightState::Simulation:
                currentState = handleSimulation();
                break;
            case FlightState::Recovered:
                currentState = handleRecovered();
                break;
        }
    }
    return 0;
}

关键优势

  • 完全规避goto,代码结构清晰,职责划分明确
  • 状态跳转逻辑直观,可轻松实现任意状态间的切换(比如Landed直接返回Idle)
  • 单个状态的逻辑独立,便于后期维护和扩展新功能

内容的提问来源于stack exchange,提问作者ahmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:31:09