0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言表驱动详解

玩转单片机 来源:玩转单片机 2023-03-06 09:07 次阅读

前段时间写了篇介绍命令行交互工具,不知道各位有没去看看源码,里边有个写法和前段时间介绍的链表使用很像,这就是等下介绍的表驱编程模式,表驱的核心就是“表格”,在多条件判断的时候会使用到多if嵌套,或者switch语法进行处理,但是这样写有时候也挺麻烦的,在这样的场景下就可以考虑使用表驱编程模式,把需要处理的事件或数据放到对应的表格中,最后就形成了一整个表,就可以进行查表然后进行对应操作,下面举个简单案例:

| 头文件

#include "stdio.h"
#include "stdint.h"


typedef struct
{
    void(*fp)(void);
} static_t;


extern static_t static_cmd[];


void shell_ls_cmd(void);
void shell_test_cmd(void);
void shell_test_fp(void);


void handle(void);
void push(void (*fp)(void));
void free(uint8_t select);

|定义一个表

static_tstatic_cmd[]=
{
  {shell_ls_cmd},
  {shell_test_cmd},
  {NULL}
};

| 定义回调函数

void shell_ls_cmd(void)
{
  printf("ls command
");
}


void shell_test_cmd(void)
{
  printf("test command
");
}


void shell_test_fp(void)
{
  printf("fp command
");
}

| 遍历表

void handle(void)
{
  for (uint8_t i = 0; static_cmd[i].fp != NULL; i++)
  {
    static_cmd[i].fp();
  }
}

| 添加表格

void push(void (*fp)(void))
{
    uint8_t i = 0;
// 写法1
    for(i = 0; static_cmd[i].fp != NULL; i++){};
// 写法2
/*
while(static_cmd[i].fp != NULL){
      i++;
    }
    */
    static_cmd[i].fp = fp;
    static_cmd[i+1].fp = NULL;
}

|删除表格

void free(uint8_t select)
{
  if(static_cmd[select].fp == NULL)
  {
    return;
  }
  for (uint8_t i = select; static_cmd[i].fp != NULL; i++)
  {
    static_cmd[i].fp = static_cmd[i+1].fp;
  }
}

|简单调用

int main()
{
    handle();
    printf("
");
    
    push(shell_test_fp);
    printf("
");
    
    handle();
    printf("
");
    
    free(1);
    printf("
");
    
    handle();
    while (1)
    {
        /* code */
    }
}

|查看结果

1f8812de-bb71-11ed-bfe3-dac502259ad0.png

表驱在项目中很常见,适当使用能有效提高代码的可读性,也方便后期维护的迭代!

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    12

    文章

    1838

    浏览量

    85256
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136660
  • 编程
    +关注

    关注

    88

    文章

    3614

    浏览量

    93684
  • 源码
    +关注

    关注

    8

    文章

    638

    浏览量

    29184
  • 命令行
    +关注

    关注

    0

    文章

    77

    浏览量

    10385

原文标题:C语言|表驱动

文章出处:【微信号:玩转单片机,微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言内存管理详解

    C语言内存管理详解,很不错的一份资料.
    发表于 08-06 23:14

    请问一下,用AVR studio 5如何用C语言表达attiny85的进入睡眠?

    请问一下,用AVR studio 5如何用C语言表达attiny85的进入睡眠?同时用在tkstudio软件下,都用-sleep()也都不行的,怎么解决呢?
    发表于 11-24 11:34

    [C语言开发技术详解].戴建华.扫描版

    本帖最后由 lee_st 于 2018-4-2 10:53 编辑 [C语言开发技术详解].戴建华.扫描版
    发表于 03-31 11:14

    C语言指针详解

    ];//指针的类型是 int(*)[3] (5)int*(*ptr)[4];//指针的类型是int*(*)[4] 怎么样?找出指针的类型的方法是不是很简单? 完整的C语言指针详解pdf格式文档电子发烧友下载地址(共12
    发表于 07-04 03:34

    verilog语言表示圆周率

    如何使用verilog语言表示圆周率?
    发表于 09-11 14:24

    C++ 语言命令详解(第二版)

    电子发烧友网站提供《C++ 语言命令详解(第二版).txt》资料免费下载
    发表于 07-28 13:06 0次下载

    C语言详解_ifdef等宏及妙用

    C语言详解_ifdef等宏及妙用的教程
    发表于 11-16 19:03 0次下载

    彻底搞定C语言指针详解完整版

    彻底搞定C语言指针详解完整版。
    发表于 05-10 17:04 0次下载

    ARM_C语言程序设计详解

    ARM_C语言程序设计详解
    发表于 10-27 15:39 32次下载
    ARM_<b class='flag-5'>C</b><b class='flag-5'>语言</b>程序设计<b class='flag-5'>详解</b>

    C语言的精髓——指针详解

    C语言的精髓——指针详解
    发表于 11-30 14:43 17次下载

    50套C语言试题答案详解的资料免费下载

    本文档的主要内容详细介绍的是50套C语言试题和答案详解的资料免费下载。
    发表于 09-26 16:08 18次下载

    现代交互技术下的儿童语言表达训练方法

    现代交互技术下的儿童语言表达训练方法
    发表于 06-27 11:27 3次下载

    单片机C语言和汇编语言混合编程实例详解

    单片机C语言和汇编语言混合编程实例详解
    发表于 08-16 09:50 225次下载

    详解C语言中的短路现象

      C语言一经出现,就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高,而且可移植性好,可以用来开发应用软件、
    的头像 发表于 03-12 12:23 3997次阅读
    <b class='flag-5'>详解</b><b class='flag-5'>C</b><b class='flag-5'>语言</b>中的短路现象

    基于性别的暴力(GBV)的语言表达如何影响责任认知

    不同的语言表达可以通过强调某些部分从不同的角度来概念化同一事件。该论文调查了一个具有社会后果的案例:基于性别的暴力(GBV)的语言表达如何影响责任认知。
    的头像 发表于 11-12 10:28 1528次阅读