FreeModbus--学习函数指针

目录

函数指针

最简单的例子

稍作修改例子

引入协议栈的函数指针

引入协议栈第二处函数指针


函数指针

该协议栈中使用到函数指针,现开展一篇专门存放函数指针的文章。

C语言的函数指针是指向函数的指针变量,可以用来存储和调用函数的地址。在C语言中使用函数指针可以实现以下几种功能:

        作为函数的参数:函数指针可以作为参数传递给其他函数,使得可以在调用函数时动态指定要执行的函数。

        作为函数的返回值:函数指针可以作为函数的返回值,返回指向函数的地址。

        作为数组元素:可以使用函数指针数组来存储多个函数的地址,便于根据需要选择执行某个函数。

最简单的例子

#include <stdio.h>

typedef void (*FuncPtr)(int);	// 声明一个函数指针类型

/* 定义两个函数,用于演示函数指针的操作 */
void func1(int num) 
{
    printf("This is function 1 with argument %d\n", num);
}

void func2(int num) 
{
    printf("This is function 2 with argument %d\n", num);
}

int main() 
{
    // 声明函数指针变量
    FuncPtr ptr;
	
    // 将函数地址赋值给函数指针变量
    ptr = func1;
    // 通过函数指针调用函数
    ptr(10);
	
    // 将函数地址赋值给函数指针变量
    ptr = func2;
    // 通过函数指针调用函数
    ptr(20);
	
    return 0;
}

稍作修改例子

为了更贴合协议栈的函数指针,稍加修改例子。

typedef enum
{
    MB_EX_NONE = 0x00,
    MB_EX_ILLEGAL_FUNCTION = 0x01,
    MB_EX_ILLEGAL_DATA_ADDRESS = 0x02,
    MB_EX_ILLEGAL_DATA_VALUE = 0x03,
    MB_EX_SLAVE_DEVICE_FAILURE = 0x04,
    MB_EX_ACKNOWLEDGE = 0x05,
    MB_EX_SLAVE_BUSY = 0x06,
    MB_EX_MEMORY_PARITY_ERROR = 0x08,
    MB_EX_GATEWAY_PATH_FAILED = 0x0A,
    MB_EX_GATEWAY_TGT_FAILED = 0x0B
} eMBException;

typedef eMBException ( *pxMBFunctionHandler )( UCHAR * pucFrame, USHORT * pusLength );

// 定义一个函数,其参数和返回值类型符合函数指针的定义
eMBException myFunctionHandler(UCHAR * pucFrame, USHORT * pusLength) 
{
    // 在这里编写你的函数逻辑
    // ...
}

int main() 
{
    // 声明一个指向函数的指针,并将其指向具体的函数
    pxMBFunctionHandler myHandler = myFunctionHandler;
	
    // 调用函数指针指向的函数
    UCHAR frame;
    USHORT length;
	
    eMBException result = myHandler(&frame, &length);
	
    // 对返回结果做进一步处理
    // ...
    
    return 0;
}

引入协议栈的函数指针

引入协议栈第二处函数指针

相关推荐

  1. 指向函数指针

    2023-12-15 16:28:02       25 阅读
  2. 函数指针

    2023-12-15 16:28:02       54 阅读
  3. 从零开始学习嵌入式----C语言指针函数

    2023-12-15 16:28:02       22 阅读
  4. 50. C++ 指针函数函数指针

    2023-12-15 16:28:02       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-15 16:28:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-15 16:28:02       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-15 16:28:02       82 阅读
  4. Python语言-面向对象

    2023-12-15 16:28:02       91 阅读

热门阅读

  1. android webrtc入门教程一(简单一对一通话实现)

    2023-12-15 16:28:02       55 阅读
  2. linux下查看日志命令

    2023-12-15 16:28:02       52 阅读
  3. python进阶:深入理解迭代器和生成器

    2023-12-15 16:28:02       65 阅读
  4. SpringBoot 源码解析

    2023-12-15 16:28:02       60 阅读
  5. 解决子组件没有渲染完出现的报错

    2023-12-15 16:28:02       54 阅读
  6. WordPress任务计划异步执行(WordPress后台速度优化

    2023-12-15 16:28:02       62 阅读
  7. Audio signal (MATLAB)代码学习-常见问题2

    2023-12-15 16:28:02       51 阅读
  8. 【Go语言分析 select case 】

    2023-12-15 16:28:02       57 阅读