表驱动法在项目中的应用

C语言表驱动法 最近了解到一种C语言的写法,故记录下来,内容来自deepseek。 阅读详情

在编码过程中,有一类场景往往是根据不同的输入或者条件,调用不同的函数。比如在通信设计领域,往往会有不同的消息到达,而不同的消息需要对应不同的处理函数。这样一来,如果我们采用常见的if....else或者switch......case等条件结构,分支会非常多,而且逻辑结果很混乱。那么此时把条件和对应的操作函数放入到一张表中,则可以简化代码,也便于后期维护拓展。当然最好的还是用状态机实现的,这个后面再单独讲解。下面我们以数字加减乘除求模四则运算来演示这一过程。本例中只用一个静态表,实际应用中,可以是事件类型与对应动作各一张表,索引号一一对应即可。

//============================================================================
// Name        : CTest.cpp
// Author      : @CodingGeek
// Version     : 1.0
// Copyright   : Your copyright notice
// Description : 表驱动法代码研究
//============================================================================

#include <iostream>
#include <string.h>

using namespace std;

typedef int(*T_Func)(int, int);
typedef struct
{
    const char *computeType;
    const char *des;
    T_Func pFunc;
} T_ComputeType;

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

int sub(int a, int b)
{
    return a - b;
}
int multi(int a, int b)
{
    return a * b;
}

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

int mod(int a, int b)
{
    return a % b;
}

T_ComputeType g_computeTbl[] =
{
    {"add", "add two numbers", add},
    {"sub", "sub two numbers", sub},
    {"mul", "mul two numbers", multi},
    {"div", "div two numbers", divide},
    {"mod", "mod two numbers", mod},
    {NULL,  NULL,  NULL}
};

int compute(const char *pComputeType, int a, int b)
{
    int i = 0;
    while (g_computeTbl[i].computeType != NULL)
    {
        if (strcmp(g_computeTbl[i].computeType, pComputeType) == 0)
        {
            return g_computeTbl[i].pFunc(a, b);
        }
        i++;
    }

    return 0;
}

int main()
{

    cout << compute("sub", 23, 4) << endl;


    return 0;
}

如果要新增一个接口,则只需在对应的表中加入函数符号和实现该函数接口即可,极大地提高了代码可维护性,实际项目中这也是最常见和常用的技巧!

基于表驱动法的三种实现方法 表驱动法分为直接访问,索引访问,阶梯访问三种方式,分别对应相应代码,代码里有详细注释 立即下载

相关推荐

C语言设备驱动程序的编写

该文档是PDF格式,主要讲述了设备驱动程序的编写

表驱动法在STM32中的应用

所谓表驱动法(Table-Driven Approach)简而言之就是用查表的方法获取数据。此处的“表”通常为数组,但可视为数据库的一种体现。根据字典中的部首检字表查找读音未知的汉字就是典型的表驱动法,即以每个字的字形为依据,计算出一个索引值,并映射到对应的页数。相比一页一页地顺序翻字典查字,部首检字法效率极高。具体到编程方面,在数据不多时可用逻辑判断语句(if…else或switch…case)来获取值;但随着数据的增多,逻辑语句会越来越长,此时表驱动法的优势就开始显现。

人生一路,点滴记录 3832

常见js手撕题及算法总结

设计一个lazyMan,实现以下功能: LazyMan(‘Tony’); // Hi I am Tony LazyMan(‘Tony’).sleep(10).eat(‘lunch’); // Hi I am Tony // 等待了10秒… // I am eating lunch LazyMan(‘Tony’).eat(‘lunch’).sleep(10).eat(‘dinner’); // H...

没有名字适合我的博客 3176

表驱动法(Table-Driven Approach)

但将2位的编号转换为1位的键值,可能过于复杂或没有规律,最合适的方法是建立一个保存该转换关系的索引表。如果按照这种方法写下去,那么在我的每一个函数里面,都必须作如此多的判断,写出的代码肯定很长,并且每一次处理,都要作许多次判断之后才找到正确的处理函数,代码的执行效率也不高。,表驱动的核心是key-handler,拿某个key去对应某个handler,只要条件符合key,那么就执行对应的handler。使用索引的时候,先用一个基本类型的数据从一张索引表中查出一个键值,然后再用这一个键值查出你需要的主数据。

qq_45885788的博客 2400

AutoCAD提示找不到acdb24.dll、AcGe24.dll、AcPal.dll、AcUt.dll怎么办?

在我们安装了AutoCAD 2023版本以后,打开CAD,可能会出现dll文件丢失的情况,如下所示:1、由于找不到acdb24.dll,无法继续执行代码。重新安装程序可能解决此问题。2、由于找不到AcGe24.dll,无法继续执行代码。重新安装程序可能解决此问题。3、由于找不到AcPal.dll,无法继续执行代码。重新安装程序可能解决此问题。4、由于找不到AcUt.dll,无法继续执行代码。重新安装程序可能解决此问题。遇到AutoCAD启动系统错误,由于找不到dll文件该怎么处理呢?

huoxu369的博客 1万+

AI大模型驱动Web UI自动化测试:Playwright与RobotFramework智能整合实践

Web自动化测试是软件质量保障的关键环节,其核心原理是通过脚本模拟用户操作,对Web应用界面进行功能验证。传统方法依赖固定的元素定位和脚本逻辑,在应对频繁的UI变更时面临维护成本高、脚本脆弱的挑战。随着AI大模型技术的发展,其强大的自然语言理解和代码生成能力为自动化测试带来了新的技术价值。通过将大模型的意图理解与代码生成能力,与Playwright强大的浏览器自动化执行引擎以及RobotFramework灵活的关键字驱动框架相结合,可以构建出能够理解自然语言指令、动态生成稳定操作脚本的智能测试系统。这种融合

weixin_28718769的博客 412

表驱动法(Table-Driven Methods)

背景 表驱动方法是一种方案,它允许您在表中查找信息,而不是使用逻辑语句(if和 case)来查明信息。实际上,您可以使用逻辑语句选择的任何内容,都可以使用表进行选择。在简单情况下,逻辑语句更容易,更直接。随着逻辑链变得越来越复杂,表格变得越来越有吸引力。 当使用表驱动方法时,必须解决两个问题。首先,您必须解决如何在表中查找条目的问题。您可以使用一些数据直接访问表。例如,如果您需要按月对数据进行分类...

Jeff_的博客 1万+

Quartus II编译时出现Error (119013): Current license file does not support the EP4CE6E22C6 device

Quartus II编译时出现Error (119013): Current license file does not support the EP4CE6E22C6 device, Quartus的安装过程不同于ISE/vivado的安装。“Current license file does not support”这种情况多出现在高版本的quartus中综合很久以前的代码,使用很早型号的FPGA或是CPLD。对于这种情况,就得在官网或是其他网站上下载包含所需Device的库文件。

夜半少年的博客 1万+

一文讲懂表驱动法

什么是表驱动法?是一种编程模式,从表里查找信息而不使用逻辑语句(if 和case)。事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。对简单的情况而言,使用逻辑语句更为容易和...

架构精进之路 3404

计算机组成原理(第三版)唐朔飞-第五章输入输出系统-课后习题

计算机组成原理(第三版)唐朔飞-第五章输入输出系统-课后习题

weixin_45735391的博客 6万+

Trae 保姆级使用指南,零基础小白也能实现编程。

Trae 使用指南 Trae AI 使用 零基础编程 满血版 DeepSeek-R1&V3 AI IDE 深度理解中文开发场景 傻瓜式编程 编程入门 开发入门

Mr.L-OAM的博客 5816

【知识分享】C语言中的设计模式——表驱动模式

表驱动本身是强烈依赖于数组结构,可以是一维数组,也可以是多维数组,然后根据该数据的分布式结构进行数据索引。即使是使用一维数组,也是通过数组下标索引到对应的数据,从索引这个角度来看,是Key-Value这种键-键值的对应关系,像极了在表格中查找数据(通过行和列找到对应的格子),所以称之为表驱动。............

知识噬元兽的博客 3523

数据分享|1961-2017年中国0.25°×0.25° 逐日地表水文数据集(VIC-CN05.1)

其中,全球径流中心(University of New Hampshire and Global Runoff Data Centre, UNH/GRDC)的复合产流场集成了观测的河道径流和水量平衡模式模拟的地表和地下径流,常被用来评估模拟的径流。在长白山、海北灌丛和千烟洲通量站,模拟与观测的逐月潜热通量的平均NSE为0.61。VIC-CN05.1受益于较准确的大气驱动场、先进的地表水文参数化方案以及更真实丰富的土壤信息,可作为中国水文气象研究的参照数据,用于陆面模式的评估和长期的趋势分析等。

J_Giser的博客 1832

表驱动法的编程

表驱动法 从一个程序的改进 表驱动法的优缺点 表驱动法和状态机的关系

xzdong的专栏 798

独家开源|RK3588 平台 YOLOv5 Android 源码级解析:NPU 量化、多线程与目标跟踪实战

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

m0_71589036的博客 193

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

《代码大全》——①表驱动法初体验,要的就是高级感

之前翻《code complete》(中文:代码大全)的时候,看到讲解表驱动法的地方,当时觉得很好懂。 于是在工作中,经常思考怎么把表驱动法运用到实际的代码编写中。经过一段时间的探索,才终于有点豁然开朗的感觉。 当前的项目以Mongodb作为数据载体,熟悉Mongodb的同学都知道这种nosql类型的数据库插数据非常自由,只要符合json格式,都可以被插入到表当中。这也是mongodb作为非关系型...

Just do IT. 1327

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

表驱动的简单应用

上周顿哥给我们将了表驱动法的应用,刚好项目中也用上了,在这里对它的最简单的应用小结下。 记得当时顿哥给我们举了个最简单的实例,就是写一个方法,通过传入月份来获取传入月份的天数(二月算28天)。 当时我的想法是用一个Switch case语句来实现。脑袋里还没有表的概念。下面举出粗略的实现代码。 采用逻辑语句(switch 或 if else)实现如: public int getDays

Sunnyfans的专栏 1303

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

lwip-2.0.3

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

编程思想:设计模式如何在项目中优雅落地

基于个人的经验,谈谈设计模式在项目开发中的应用。因为是经验之谈,没有绝对的对与错。下面整理的是我最常使用的设计模式与大家分享

weixin_46844402的博客 1047

表驱动法实战:用 Qt/C++ 告别面条代码与状态机噩梦

在软件工程中,分支爆炸与重复逻辑常导致代码难以维护,尤其在客户端开发场景下,大量 if-else 与 switch 混合业务状态,形成典型的“面条代码”。表驱动法作为一种数据驱动设计思想,通过将变化逻辑抽象为静态或动态查找表,把判断从代码转移到数据,从而降低认知复杂度并提升扩展性。其核心原理是分离稳定的处理流程与易变的条件映射,常借助 QMap、QHash、状态转移表或注册中心落地。在 Qt/C++ 技术栈中,该方法可结合信号槽、元对象系统与属性系统,实现从消息分发、界面初始化到复杂状态机的统一建模,同时保

weixin_29195615的博客 275

表驱动法

表驱动法: 一种编程模式,从表里面查找信息而不使用逻辑语句(if、case)。事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。对简单的情况而言,使用简单的逻辑语句更为容易和直白,但随着逻辑链的越来越复杂,查表法也就愈发显得更具吸引力。 表驱动法使用总则 使用复杂的逻辑对字符进行分类: if (( 'a' <= InputChar ) and ( InputChar <= ...

叮咚的博客 8197

嵌入式软件开发中的表驱动法:原理、应用与实战

表驱动法是嵌入式软件开发中“用数据驱动逻辑”的高效设计方法,通过将条件判断转化为查表操作,显著简化代码、提升可维护性和扩展性。在状态机管理、命令解析、数据转换等场景中,其优势尤为突出,能有效应对嵌入式系统资源受限和实时性要求高的挑战。掌握表驱动法的核心是**“将变化的内容(数据、行为)抽离到表中,保持核心逻辑稳定”**。实际开发中,需根据具体场景选择表的类型(数据/函数表)、优化查找效率,并遵循ROM存储、静态初始化等嵌入式最佳实践,才能充分发挥其价值。建议:在嵌入式项目中,当发现代码中出现3个以上相似。

1225

表驱动法的理解

前言       为什么想写这篇关于表驱动文章呢?在看到《C标准库》第二章关于的实现后,才很大程度上体会到了什么才是表驱动,对它有了稍微深入的理解,写下文章与大家交流交流,望大家赐教。 什么是表驱动法      按照《代码大全》的说法,“表驱动法是一种编程模式——从表里

3119

C++的表驱动法

C++的表驱动法 目的:使用表驱动法,替换复杂的if/else和switch/case语句。  一、常用示例  以switch为例,常用示例如下: Funcition() { switch (key) { case key1: statements 1; break;

zhouyulu的工作历史 7427

一种表驱动法解析URC消息的实现

  看完我昨天发的博客的朋友应该了解了几种接收模块响应的方法,如果没看过,可以点击分享几个单片机接收AT指令响应数据的方法先查看下。 前言   今天我要分享一种单片机中分离URC数据的方法,和上文废话连篇不同的是,这次全篇干货哦!   文章涉及到的表驱动法,可以说是本次的精髓,这里不对表驱动法做过多解释,有兴趣的朋友可以自行查阅下相关资料,我这里只是用它实现个功能罢了,这个设计方法真的很香。   在表驱动法中还带有URC之间的粘包处理和命令回复与URC之间的粘包处理。   为什么要做这个呢?主要是因为,之.

qq_33181655的博客 6628

C语言表驱动法编程实践

转自 http://www.cnblogs.com/clover-toeic/p/3730362.html 数据压倒一切。如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明。编程的核心是数据结构,而不是算法。 ——Rob Pike  说明      本文基于这样的认识:数据是易变的,逻辑是稳定的。      本文例举的编程实现多为代码片段

flexman09的专栏 4453

浅谈表驱动法的应用

简单的表驱动法是表驱动法的一种简化应用,适用于条件较少、逻辑不复杂的场景。它仍然通过表格或数组的形式来管理条件和对应操作,但实现上更加直接和轻量。假设你正在开发一个简单的命令行工具,它可以处理几个基本命令:启动、停止、重启和退出。我们可以通过简单的表驱动法来实现命令与其对应处理函数的映射。这种简单表驱动法可以在很多小型项目中起到简化逻辑的作用,代码更加清晰,也易于维护和扩展。例子:简单的命令解析器。

weixin_43988887的博客 426
上一篇: 几种常见STL容器类操作
下一篇: C++ string类应用
CodingGeek
博客等级 码龄18年 15粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值