为什么顶级工程师都用函数指针数组写状态机?真相令人震惊

第一章:为什么顶级工程师偏爱函数指针数组实现状态机

在嵌入式系统和高可靠性软件架构中,状态机是控制逻辑的核心设计模式。顶级工程师倾向于使用函数指针数组来实现状态机,因其具备高效分发、低维护成本和清晰的结构优势。

函数指针数组的优势

  • 状态切换无需条件判断,直接通过索引调用,提升执行效率
  • 状态处理逻辑集中管理,便于扩展和单元测试
  • 编译期可验证函数签名一致性,减少运行时错误

典型实现示例


// 定义状态处理函数类型
typedef void (*state_handler_t)(void);

// 实现各个状态的行为
void idle_state()   { /* 空闲逻辑 */ }
void run_state()    { /* 运行逻辑 */ }
void error_state()  { /* 错误处理 */ }

// 函数指针数组定义状态跳转表
state_handler_t state_table[] = {
    [STATE_IDLE]  = idle_state,
    [STATE_RUN]   = run_state,
    [STATE_ERROR] = error_state
};

// 状态机调度核心
void dispatch_state(int current_state) {
    if (current_state < 0 || current_state >= STATE_MAX) return;
    state_table[current_state](); // 直接调用对应状态函数
}

性能与可维护性对比

实现方式时间复杂度可扩展性代码密度
if-else 链O(n)差高
switch-caseO(1)中中
函数指针数组O(1)优低
graph LR A[开始] --> B{状态更新} B --> C[查表获取函数指针] C --> D[调用状态处理函数] D --> E[结束]

第二章:状态机与函数指针基础理论

2.1 状态机的核心概念与应用场景

状态机是一种描述系统在不同状态之间转换行为的数学模型,广泛应用于协议解析、UI控制和工作流引擎中。其核心由状态、事件、动作和转移条件构成。
状态机基本组成
  • 状态(State):系统所处的特定情形,如“待支付”、“已发货”;
  • 事件(Event):触发状态变更的动作,如“用户付款”;
  • 转移(Transition):在事件驱动下从一个状态转向另一个状态。
典型应用场景
// 订单状态机示例
type OrderState string

const (
    Pending   OrderState = "pending"
    Paid      OrderState = "paid"
    Shipped   OrderState = "shipped"
    Completed OrderState = "completed"
)

func (s *OrderState) transition(event string) {
    switch *s {
    case Pending:
        if event == "pay" {
            *s = Paid
        }
    case Paid:
        if event == "ship" {
            *s = Shipped
        }
    }
}
上述代码实现了一个简化的订单状态流转逻辑。通过事件判断执行状态迁移,确保业务流程符合预定义路径。该模式提升了系统的可维护性与状态一致性。

2.2 C语言函数指针的语法与特性解析

函数指针是C语言中一种特殊的指针类型,用于指向函数的入口地址。其基本语法为:`返回类型 (*指针名)(参数列表)`。
函数指针的声明与赋值

int add(int a, int b) {
    return a + b;
}

int (*func_ptr)(int, int);  // 声明函数指针
func_ptr = &add;            // 指向函数add
上述代码中,func_ptr 是一个指向接受两个 int 参数并返回 int 的函数的指针。&add 获取函数地址,也可省略取址符直接赋值。
调用方式与应用场景
通过函数指针调用函数有两种等效写法:func_ptr(2, 3) 或 (*func_ptr)(2, 3)。该机制广泛应用于回调函数、动态行为绑定和函数表实现。
  • 支持运行时动态选择函数逻辑
  • 提升代码模块化与可扩展性

2.3 函数指针数组的构建与调用机制

在C语言中,函数指针数组是一种将多个函数地址组织成数组的数据结构,常用于状态机、回调机制和插件式架构设计。
定义与初始化
函数指针数组的声明需统一函数签名。例如,定义一个返回int、接受int参数的函数指针数组:

int func_a(int x) { return x + 1; }
int func_b(int x) { return x * 2; }
int func_c(int x) { return x - 3; }

int (*func_array[])(int) = {func_a, func_b, func_c};
上述代码中,func_array 是一个包含三个函数指针的数组,每个函数均符合 int (*)(int) 类型。
调用机制
通过索引调用对应函数:

int result = func_array[0](5); // 调用 func_a(5),结果为6
该机制实现运行时动态分发,提升程序灵活性与可扩展性。
  • 函数指针数组适用于多分支逻辑的简洁表达;
  • 结合枚举使用可增强代码可读性。

2.4 传统switch-case状态机的局限性分析

在嵌入式系统与事件驱动架构中,switch-case常被用于实现状态机逻辑。然而,随着状态数量增加,其可维护性显著下降。
代码膨胀与可读性差
每个状态分支需显式编写,导致代码冗长。例如:

switch (state) {
    case IDLE:
        if (event == START) state = RUNNING;
        break;
    case RUNNING:
        if (event == PAUSE) state = PAUSED;
        else if (event == STOP) state = IDLE;
        break;
    // 更多状态...
}
上述代码难以追踪状态转移路径,且新增状态需修改多个case块,违反开闭原则。
状态转移逻辑分散
状态跳转条件散落在各case中,缺乏统一管理。使用状态转移表可集中定义:
当前状态事件下一状态动作
IDLESTARTRUNNINGinit_timer()
RUNNINGPAUSEPAUSEDpause_timer()
该方式提升可配置性,便于自动化验证状态迁移合法性。

2.5 函数指针数组如何提升状态切换效率

在嵌入式系统或多状态应用中,频繁的状态判断与分支跳转会显著影响执行效率。使用函数指针数组可将状态码直接映射到对应处理函数,避免冗长的 if-else 或 switch-case 判断。
函数指针数组定义示例

void state_idle()   { /* 空闲状态逻辑 */ }
void state_run()    { /* 运行状态逻辑 */ }
void state_stop()   { /* 停止状态逻辑 */ }

void (*state_table[])(void) = { state_idle, state_run, state_stop };
上述代码定义了一个函数指针数组 state_table,每个元素指向一个无参数无返回值的函数。通过状态编号(如 0、1、2)直接索引调用:state_table[state]();,实现 O(1) 时间复杂度的状态调度。
性能优势对比
方式时间复杂度可维护性
if-else 链O(n)低
函数指针数组O(1)高
该结构特别适用于状态数量固定且密集编号的场景,大幅减少条件判断开销,提升系统响应速度。

第三章:函数指针数组实现状态机的关键设计

3.1 状态与行为的解耦:从数据驱动到行为映射

在现代前端架构中,状态管理逐渐从被动更新转向主动映射。通过将组件的渲染逻辑与用户行为分离,系统可实现更高的可维护性与测试性。
数据同步机制
采用观察者模式实现状态变更的自动通知:
class Store {
  constructor() {
    this.state = { count: 0 };
    this.listeners = [];
  }

  setState(newState) {
    this.state = { ...this.state, ...newState };
    this.listeners.forEach(fn => fn());
  }

  subscribe(fn) {
    this.listeners.push(fn);
  }
}
上述代码中,setState 触发所有订阅的回调,确保视图与状态同步,而 subscribe 实现了行为对状态变化的响应。
行为映射策略
通过映射表定义事件与动作的对应关系:
  • UI事件(如 click)触发 action type
  • reducer 根据 type 计算新状态
  • 视图基于新状态重新渲染
这种模式提升了逻辑的可追踪性与调试效率。

3.2 状态表的设计原则与内存布局优化

在高并发系统中,状态表的合理设计直接影响系统的性能与可扩展性。核心设计原则包括数据局部性优先、字段紧凑排列以及无锁访问支持。
内存对齐与结构体布局
为提升缓存命中率,应避免伪共享(False Sharing),确保热点字段独占缓存行(通常64字节)。
struct alignas(64) StateEntry {
    uint64_t timestamp;
    uint32_t status;
    uint32_t padding; // 防止跨缓存行
};
该结构体通过 alignas(64) 强制对齐到缓存行边界,padding 字段避免相邻数据干扰,提升多核读写效率。
字段排序优化策略
  • 高频访问字段置于结构体前部
  • 冷热数据分离以减少缓存污染
  • 使用位域压缩标志类字段

3.3 安全性保障:边界检查与非法状态拦截

在高并发系统中,确保状态机的安全性至关重要。边界检查和非法状态拦截是防止数据越界和状态错乱的核心机制。
边界检查的实现
每次写入操作前,系统会对索引和长度进行合法性校验,避免数组越界或内存溢出。

func (sm *StateMachine) Apply(entry Entry) error {
    if entry.Index < 0 || entry.Index >= len(sm.log) {
        return fmt.Errorf("index out of bounds: %d", entry.Index)
    }
    // 应用状态变更
    sm.applyEntry(&entry)
    return nil
}
该代码段在应用日志条目前验证索引范围,若超出当前日志长度则返回错误,防止非法访问。
非法状态转移拦截
通过状态机转换表限制无效迁移,例如不允许从“Leader”直接进入“Candidate”。
当前状态允许转移至
FollowerCandidate, Leader
CandidateLeader, Follower
LeaderFollower

第四章:工业级状态机实战案例剖析

4.1 嵌入式设备通信协议状态机实现

在嵌入式系统中,通信协议的稳定性依赖于精确的状态管理。采用有限状态机(FSM)模型可有效控制设备在不同通信阶段的行为转换。
状态机设计核心结构
定义清晰的状态集合与事件触发机制是关键。常见状态包括:IDLE(空闲)、SEND(发送)、RECEIVE(接收)、ERROR(错误)等。

typedef enum {
    STATE_IDLE,
    STATE_SEND,
    STATE_RECEIVE,
    STATE_ERROR
} comm_state_t;

typedef struct {
    comm_state_t current_state;
    void (*state_handler)(void);
} fsm_t;
该C语言结构体封装了当前状态和对应处理函数,便于模块化维护。每次事件触发后,根据当前状态执行相应操作并迁移至下一状态。
状态转换逻辑
  • 从 IDLE 接收到发送指令 → 进入 SEND 状态
  • SEND 完成后 → 切换至 RECEIVE 等待响应
  • 超时或校验失败 → 转入 ERROR 并尝试重试

4.2 多事件触发下的状态迁移处理

在复杂系统中,多个事件可能同时或连续触发,导致状态机面临并发迁移的挑战。为确保状态一致性,需引入事件队列与优先级调度机制。
事件去重与排序
通过时间戳和事件类型对输入事件进行排序,避免因乱序处理引发非法状态跳转。高优先级事件(如错误中断)应前置处理。
  • 事件入队:将外部输入统一接入事件队列
  • 优先级判定:依据事件类型分配处理顺序
  • 原子化迁移:每次仅执行一个状态变更操作
代码实现示例
func (sm *StateMachine) HandleEvent(event Event) {
    // 按优先级插入事件队列
    sm.eventQueue = insertByPriority(sm.eventQueue, event)
    for len(sm.eventQueue) > 0 {
        e := heap.Pop(&sm.eventQueue).(Event)
        if sm.canTransition(e) {
            sm.transition(e) // 原子状态迁移
        }
    }
}
上述代码中,HandleEvent 将事件按优先级插入堆结构队列,逐个取出并校验迁移条件,确保在多事件场景下仍能有序完成状态变更。

4.3 可扩展状态机框架的设计与封装

在构建高可用系统时,状态机的可扩展性至关重要。通过接口抽象核心行为,可实现运行时动态切换状态逻辑。
核心接口定义
type State interface {
    Enter(ctx *Context)
    Execute(ctx *Context) State
    Exit(ctx *Context)
}
该接口规范了状态的进入、执行与退出行为,Execute 返回下一状态,支持链式流转。上下文 Context 封装共享数据与配置。
状态注册机制
使用映射表管理状态实例,支持按名称动态加载:
  • Register(name string, state State):注册新状态
  • Get(name string) State:获取已有状态
流转控制结构
状态转换由中央控制器驱动,依据当前状态返回值更新实例引用,确保单例运行与线程安全。

4.4 性能对比实验:函数指针 vs switch-case

在高频调用的分发场景中,函数指针与 switch-case 是两种常见的控制流实现方式。为评估其性能差异,我们设计了百万级调用循环的基准测试。
测试代码实现

// 函数指针版本
void (*func_ptr[4])() = {task_a, task_b, task_c, task_d};
for (int i = 0; i < N; i++) {
    func_ptr[data[i]]();
}

// switch-case 版本
for (int i = 0; i < N; i++) {
    switch (data[i]) {
        case 0: task_a(); break;
        case 1: task_b(); break;
        case 2: task_c(); break;
        case 3: task_d(); break;
    }
}
上述代码分别使用函数指针数组直接跳转和 switch-case 条件判断执行对应任务函数。函数指针避免了比较操作,理论上具有更快的分发速度。
性能对比结果
实现方式平均耗时(ms)CPU 缓存命中率
函数指针12089%
switch-case14582%
结果显示,函数指针在大规模调用下性能更优,主要得益于间接跳转的确定性与更好的指令缓存局部性。

第五章:从代码整洁到架构演进的深层思考

代码质量是架构演进的基石
保持代码整洁不仅仅是命名规范和函数拆分,更是为未来扩展预留空间。例如,在 Go 语言中,通过接口隔离实现逻辑解耦:

type PaymentProcessor interface {
    Process(amount float64) error
}

type StripeProcessor struct{}

func (s *StripeProcessor) Process(amount float64) error {
    // 调用 Stripe API
    return nil
}
这种设计使得后续替换支付渠道无需修改核心业务逻辑。
微服务拆分中的实际考量
当单体应用增长到一定规模,需评估是否拆分。常见判断依据包括:
  • 团队协作效率下降,多人频繁修改同一模块
  • 部署频率受限,一个功能上线需等待无关模块测试
  • 技术栈升级困难,无法局部迭代
某电商平台在用户量突破百万后,将订单、库存、用户三模块独立部署,显著提升了发布灵活性。
数据一致性与服务自治的平衡
分布式环境下,强一致性代价高昂。实践中常采用最终一致性方案。下表展示了不同场景下的策略选择:
场景一致性模型实现方式
订单创建强一致同步事务 + 锁
积分更新最终一致消息队列异步通知
下单成功 → 发布 OrderCreated 事件 → 积分服务消费事件 → 更新用户积分
Generator函数(状态机)的语法 1、基本概念 Generator函数(生成器函数)是ES6提供的一种异步编程解决方案,语法行为和传统函数完全不同。 从语法上:首先可以把它理解成一个状态机,封装了多个内部状态。 返回遍历器对象:执行Generator函数会返回一个遍历器对象,返回的遍历器对象可以依次遍历Generator函数内部的每一个状态。 形式上:Generator函数是一个普通函数,有两个特征:①function命令与函数名之间有一个星号;②函数体内部使用yield语句定义不同的内部状态(yield即产出的意思) funct 阅读详情

相关推荐

【编程之美】函数指针方法实现简单状态机(附代码)

关注、星标公众号,直达精彩内容ID:技术让梦想更伟大作者:李肖遥之前写过一篇状态机的实用文章,很多朋友说有几个地方有点难度不易理解,今天给大家换种简单写法,使用函数指针的方法实现状态机。...

李肖遥的专栏 2234

用函数指针来实现状态机

状态机的基本实现手段是`switch case`语句,不过也可以用函数指针来实现

zoomdy's blog 1924

科技中介服务机构如何利用数智工具提升服务效率?.docx

科技中介服务机构如何利用数智工具提升服务效率?

嵌入式状态机架构,一文讲透!

本文介绍了状态机在嵌入式开发中的应用。针对if-else嵌套导致的代码复杂度问题,文章首先分析了传统串口协议解析代码的缺陷,进而阐述了状态机原理(四要素和两种类型)。通过实例展示了如何用状态机重构串口接收模块,使代码更清晰可维护。文章还分析了FreeRTOS和lwIP中的状态机实现,并对比了Zephyr SMF、QP/C和TinyFSM三种嵌入式状态机框架的特点和适用场景。状态机可有效管理复杂状态转换,提升代码可读性和可测试性,特别适合事件驱动的嵌入式系统开发。

嵌入式大杂烩 1188

基于非对称纳什谈判的多微网电能共享运行优化策略(Matlab代码实现)

基于非对称纳什谈判的多微网电能共享运行优化策略(Matlab代码实现)内容概要:本文档标题为《Plecs全桥LLC谐振变换器仿真模型.txt》,但实际上内容并未围绕Plecs或全桥LLC谐振变换器展开详细论述,而是罗列了大量基于Matlab/Simulink和Python的科研仿真项目标题及相关技术方向,涵盖电力系统、无人机控制、微电网优化、路径规划、状态估计、信号处理、电动汽车调度、电力电子变换器等多个领域。其中包括多种优化算法(如粒子群、遗传算法、NSGA-II)、控制策略(如PID、MPC、滑模控制)、仿真建模(如LLC谐振变换器、DAB变换器、PWM整流器)以及具体应用场景的研究实现。尽管提及“隔离型全桥LLC谐振变换器建模及参数设计资料”,但全文缺乏对该主题的具体描述、模型细节或仿真分析,仅作为条目之一出现。因此,该文档实质是一份科研项目资源清单或代码合集目录,而非针对某一主题的深入文章。; 适合人群:具备一定Matlab/Simulink或Python编程基础,从事电气工程、自动化、控制科学、电力电子、新能源系统等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①为科研工作者提供丰富的课题参考与复现资源,涵盖优化调度、控制系统设计、电力电子仿真等方向;②辅助完成硕士/博士论文、期刊论文复现、课程设计或项目开发,提升研究效率与创新性;③通过已有模型和代码快速搭建仿真平台,聚焦算法改进与性能优化。; 阅读建议:此文档应作为科研资源索引使用,读者可根据自身研究方向筛选相关条目,结合配套代码与参考资料进行深入学习与实践。对于希望研究全桥LLC谐振变换器的用户,需注意本文档未提供完整内容,建议查找标注的“仿真+设计报告+计算书”等附件资源以获取详细信息。

高校技术转移办公室在推动成果转化过程中,如何高效完成技术成果的信息整合与价值挖掘.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

【C语言】使用函数指针实现状态机软件框架

函数返回值类型 (* 指针变量名) (函数参数列表);

似水流年 1000

高校技术转移办公室人员,如何精准挖掘并分析企业的技术需求?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

C语言实现状态机(二)

前言 对于之前的一篇博客《C语言实现状态机》(链接:https://blog.youkuaiyun.com/qq_36969264/article/details/105865099?spm=1001.2014.3001.5501),看网友的留言,似乎对pFsm->stNextState 和 EVENT_MAP_END的比较有一些误解。 这里需要解释一下,当时这么写是为了省事,但后面看这么写确实很容易让人误解,所以这篇文章的目的是为了修改掉这个容易让人误解的地方,同时对该状态机做了一些优化。 一、实现状态机的基本

qq_36969264的博客 8732

隔离型全桥LLC谐振变化器建模及参数设计资料【仿真+设计报告+计算书】

内容概要:本文档是一套关于隔离型全桥LLC谐振变换器的综合性技术资料,系统涵盖了拓扑建模、参数设计、闭环控制策略及仿真验证等关键环节。资料整合了Simulink仿真模型、详细设计报告、Mathcad计算书以及控制算法说明文档,深入探讨了恒压恒流双闭环控制、变频与移相混合控制、软启动机制等核心技术,并提供了多应用场景实例,包括双向全桥LLC、多相交错LLC以及电动汽车V2G系统中的CLLC变换器设计。此外,配套资源还包含了多种先进控制与状态估计算法(如EKF、UKF、PF及其与神经网络融合算法)的Matlab实现代码,强化了科研复现与工程实践能力。; 适合人群:适用于电气工程、电力电子及相关专业的研究生、科研人员,以及从事高频开关电源、新能源变换器开发的工程师;需具备扎实的电路理论基础与一定的仿真软件操作经验。; 使用场景及目标:①支持全桥LLC变换器的高效参数设计与动态性能优化;②服务于高校或企业的科研项目,助力拓扑创新与控制系统开发;③作为毕业设计、学术论文或工业级产品原型开发的重要技术参考,提升系统效率、稳定性和响应速度。; 阅读建议:建议结合Simulink仿真模型与Mathcad计算书同步学习,重点关注谐振元件匹配、控制环路设计与系统稳定性分析,充分利用提供的Matlab/Simulink环境进行仿真调试与二次开发,深化理论认知与实际工程应用的融合。

C#+Winform+OpenCvSharp实战:5步搞定工业视觉检测框架(附源码下载)

本文详细介绍了如何使用C#、Winform和OpenCvSharp构建工业视觉检测框架,通过5个关键步骤实现高效、稳定的视觉检测系统。内容涵盖环境配置、相机集成、核心算法实现、系统集成与通信,以及部署优化,帮助开发者快速掌握工业视觉检测技术,提升检测精度和效率。附完整源码下载,助力工业数字化转型。

pz89012345的博客 551

为什么顶级工程师都在用函数指针数组写状态机?真相令人震惊

掌握C语言函数指针数组的状态机设计,轻松实现高效可维护的嵌入式逻辑控制。适用于协议解析、设备控制等场景,通过函数指针跳转提升状态切换性能,代码清晰易扩展。顶级工程师都在用的方法,值得收藏。

simcode的专栏 394

样本不均衡时AUC反而下降?用imbalanced-learn库实战解决分类陷阱

本文探讨了样本不均衡时AUC指标下降的现象,并通过imbalanced-learn库实战演示了如何解决这一分类陷阱。文章详细分析了不同采样技术(如SMOTE、ADASYN)对模型性能的影响,并提供了XGBoost和逻辑回归模型的优化建议,帮助数据科学家在实际项目中做出更明智的决策。

weixin_29174013的博客 343

CH32F外设驱动:SFR直驱与HAL库的工程决策指南

在MCU嵌入式开发中,外设驱动本质是通过特殊功能寄存器(SFR)操控硬件电路的行为。理解SFR操作原理,是掌握ARM Cortex-M底层时序、时钟树配置与寄存器映射差异的关键基础。相比HAL库的抽象封装,SFR直驱提供微秒级实时响应、极致资源压缩和穿透式故障诊断能力,尤其适用于CH32F等国产MCU在宽温、低功耗及工业抗干扰场景下的量产需求。其技术价值体现在对波特率精度控制、中断响应延迟、错误标志解析等硬件细节的绝对掌控,广泛应用于电机FOC控制、高可靠性通信网关与EMC严苛环境。本文聚焦CH32F平台,

weixin_34348805的博客 335

AI赋能数字人:打造与语音节奏完美匹配的高质量手势动画

想象一个场景:当你与一位数字人交谈时,它不仅能理解你的言语,还能恰到好处地挥动手臂、比划手势,就像真实的人类交流一样自然流畅。这正是当前AI技术致力于实现的目标——通过分析语音内容,自动生成与之相匹配的手势动作,为数字人赋予更加丰富的情感表达和非言语沟通能力。AI手势生成技术的出现,标志着数字人在模仿人类自然交流方式上迈出了重要一步。随着技术的不断成熟与应用场景的拓宽,未来我们可以期待更多富有表现力和情感互动的数字人出现在我们的日常生活中,开启人机交互的新篇章。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 793

点云最小二乘法拟合曲线

文章目录一、引言 一、引言

dayuhaitang1的博客 2735

状态机的三种骚操作,值得你了解

点击上方“小麦大叔”,选择“置顶/星标公众号”福利干货,第一时间送达大家好,我是小麦,这次我们一起来学习C语言实现状态机的三种方法解析。状态机的实现无非就是 3 个要素:状态、事件、响应。...

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 1119

构建基于知识图谱的金融风险关联网络可视化系统

知识图谱是一种用于表示实体及其关系的图形结构,能够将分散的数据组织成易于理解和查询的形式。语义性:通过实体和关系的描述,赋予数据语义。结构化:以图的形式组织数据,便于计算机处理。动态性:支持实时更新,能够反映数据的最新状态。风险关联网络是指将金融风险事件、实体及其关系以图形形式表示的网络。关联性:能够展示风险事件之间的相互影响。动态性:能够实时反映风险变化。可视化:便于金融从业者直观理解风险分布。可视化系统是指通过图形界面展示数据或信息的系统。提供直观的数据显示。帮助用户快速理解复杂数据。

AI天才研究院 1059

[学海拾贝]状态机思路在单片机程序设计中的应用

状态机思路在单片机程序设计中的应用  状态机的概念   状态机是软件编程中的一个重要概念。比这个概念更重要的是对它的灵活应用。在一个思路清晰而且高效的程序中,必然有状态机的身影浮现。   比如说一个按键命令解析程序,就可以被看做状态机:本来在A状态下,触发一个按键后切换到了B状态;再触发另一个键后切换到C状态,或者返回到A状态。这就是最简单的按键状态机例子。实际的按键解析程序会比这更复杂

1022

基于Python的军事装备信息爬虫实战:Scrapy+Playwright+智能反反爬技术

本文将详细介绍如何使用Python构建一个高效的军事装备信息爬虫系统。我们将从基础的HTTP请求开始,逐步深入到使用Scrapy框架、Playwright浏览器自动化以及最新的反反爬技术。文章包含完整的代码实现、性能优化策略以及数据处理方案,旨在为读者提供一个全面的军事信息爬取解决方案。关键词:Python爬虫、军事装备、Scrapy、Playwright、反反爬。

2201_76125261的博客 1155

58子站安居,经纪人营销管理平台登录接口加密逆向

实战场景password 实战分析 本次要解决的站点依旧来源自78技术人社群,有朋友希望再次说明一下其登录模块的加密参数寻找与逆向逻辑,本文我们就一起分析一下。 站点地址为:vip.anjuke.com/portal/login 通过开发者工具,可以简简单单的寻找到相应的数据。

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 2万+

状态机 函数指针 c语言,函数指针方法实现简单状态机(附代码)

之前写过一篇状态机的实用文章,很多朋友说有几个地方有点难度不易理解,今天给大家换种简单写法,使用函数指针的方法实现状态机。状态机简介有限状态机FSM是有限个状态及在这些状态之间的转移和动作等行为的数学模型,是一种逻辑单元内部的高效编程方法,可以根据不同状态或者消息类型进行相应的处理逻辑,使得程序逻辑清晰易懂。函数指针实现FSM使用函数指针实现FSM可以分为3个步骤建立相应的状态表和动作查询表根据状...

weixin_42394054的博客 765

论文分栏前后内容不连续?教你word如何删除分节符

问题 当我们在写论文的时候,很多期刊的模板都是两栏的格式,但有的时候我们插入的图像尺寸可能太大,两栏格式放不下,因此需要将其以一栏的格式出入,如下: 但当我们把图片删除后,再将其转换成两栏格式,前后内容就出现不连续的情况: 正常情况下应该是如下: 正确处理方式 里面有个分页符,把分页符去掉,或者把你的文字全部复制到记事本里,然后重新复制回word就可以取消原有的格式了。 删除分节符的方法(以word 2019为例) -点击菜单栏上的“视图”,点击“大纲视图”。 可以看到word文档以整列的形式展开:

左手の明天的博客 1万+

JavaScript状态模式及状态机模型

这是一篇,我自己都看不完的文章...文章大体就两部分:状态模式的介绍状态机模型的函数库javascript-state-machine的用法和源码解析场景及问题背景:我们...

大转转FE 994

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

函数指针与状态机的用法

在很多大型的集成系统中都会用到状态机来跳转到指定的函数,而状态机的使用过程中就离不开函数指针、结构体数组等等,下面就介绍下函数指针与状态机的用法。 结构体数组平时我们接触到的数组的元素都是数字或者字符,一般称为整型数组或者字符型数组,而结构体数组就是数组的元素是结构体,其本质上仍然是一个数组。函数指针函数指针,顾名思义,是一个指针,是一个指向函数的指针。正如指针可以指向整型变量、字符型变量以及数组,

liebecl的博客 2439

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

状态机编程技巧:状态表与函数表

没有swith case那样可以直接能通过程序代码看到各 状态 的跳转与 状态机 的执行步骤, 但这种 状态表与函数表 实现的 状态机。代码简洁,无遗漏状态,经典! 简单实例: #include char str[128] = " ./a.out 100 200 "; int argc; char * argv[16]; int i = 0; void act_save

阳光柠檬_的技术笔记 4654

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: 为什么你的fclose总是失败?深入底层剖析 errno 错误码
下一篇: 掌握这1个数据结构,让你的C程序效率提升3倍(循环队列深度解读)
QuickSolve
博客等级 码龄1年 137粉丝 2015原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值