最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

单片机

互联网 admin 20浏览 0评论

单片机

概述

       C语言结构体对函数指针封装示例(面向对象思想写法)

案例1:

1、示例:

#include <stdio.h>#define FUN_1 0U	//方法1:
#define FUN_2 0U	//方法2:
#define FUN_3 1U	//方法3:int i, j;struct DATE{int year;char month;char data;char hour;char min;char sec;
};
struct DATE date;struct str_func {int a;int b;void (*myPrintf)(void);void (*init_value)(void);void (*date_func)(void);
};void myPrintf(void) {printf("C语言结构体对函数指针封装示例 \r\n");
}void init_value(void) {i = 10;j = 20;
}void date_func(void)
{date.year = 2020;date.month = 03;date.data = 30;date.hour = 18;date.min = 01;date.sec = 25;
}//方法1:
#if FUN_1
struct str_func t_func = {.a = 5,.b = 6,.myPrintf = myPrintf,.init_value = init_value,.date_func = date_func,
};staic void fun(void)
{if (t_func.myPrintf){t_func.myPrintf();}if (t_func.init_value){t_func.init_value();printf("i=%d,j=%d \r\n", i, j);}if(t_func.date_func){t_func.date_func();printf("year:%d, month:%d, data:%d, hour:%d, min:%d, sec:%d \r\n",date.year,date.month,date.data,date.hour,date.min,date.sec);}
}
#endif
*///方法2:
#if FUN_2
void fun(void)
{struct str_func t_func = {.a = 5,.b = 6,.myPrintf = myPrintf,.init_value = init_value,.date_func = date_func,};t_func.myPrintf();t_func.init_value();printf("i=%d,j=%d \r\n", i, j);t_func.date_func();printf("year:%d, month:%d, data:%d, hour:%d, min:%d, sec:%d \r\n",date.year,date.month,date.data,date.hour,date.min,date.sec);
}
#endif//方法3:
#if FUN_3
struct str_func t_func;void fun(void)
{t_func.a = 5,t_func.b = 6,t_func.myPrintf = myPrintf,t_func.init_value = init_value,t_func.date_func = date_func,t_func.myPrintf();t_func.init_value();printf("i=%d,j=%d \r\n", i, j);t_func.date_func();printf("year:%d, month:%d, data:%d, hour:%d, min:%d, sec:%d \r\n",date.year,date.month,date.data,date.hour,date.min,date.sec);
}
#endifint main() {fun();    return 0;
}

2、运行结果:

案例2:

1、示例:(注:使用visual Studio2019编写)

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>static void HW_Init(void);  //硬件初始化
static void Sys_Run(void);  //系统运行
static void IE_Init(void);  //中断初始化#define FUN_1  1u
#define FUN_2  0u#if FUN_1
typedef struct _HandleDef {void (*hw_init)(void);void (*sys_run)(void);void (*ie_init)(void);
}HandleDef;
#endif#if FUN_1// C++语言环境(在单片机上验证未通过)也有可能是编译器的问题,现在没时间去深究它,往后有时间深入研究看看。
HandleDef handler = {handler.hw_init = HW_Init,handler.sys_run = Sys_Run,handler.ie_init = IE_Init
};// C语言环境(在单片机上验证通过)
//HandleDef handler = {
//    .hw_init = HW_Init,
//    .sys_run = Sys_Run,
//    .ie_init = IE_Init
//};
#endif#if FUN_2struct HandleDef {void (*hw_init)(void);void (*sys_run)(void);void (*ie_init)(void);
};HandleDef handler = {HW_Init,Sys_Run,IE_Init
};
#endifstatic void HW_Init(void)
{std::cout << "HW_Init !\n";
}
static void Sys_Run(void)
{std::cout << "Sys_Run !\n";
}static void IE_Init(void)
{std::cout << "IE_Init !\n";
}int main()
{handler.hw_init();handler.ie_init();handler.sys_run();
}// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

 2、运行效果:

visual studio2019示例:a

案例3:

1、示例代码(IDE: cLion)

#include<stdio.h>
#include<stdlib.h>typedef int (*Operation)(int a, int b);typedef struct {int (*fun1)(int a, int b);void (*fun2)(int a, int b);Operation add; // 函数指针Operation sub; // 函数指针
}HandleDef;static int FUN1(int a, int b)
{printf("FUN1 ! a/b=%d\n", a / b);return a / b;
}
static void FUN2(int a, int b)
{printf("FUN2 ! a*b=%d\n", a * b);
}static int ADD(int a, int b)
{printf("ADD ! a+b=%d\n", a + b);return a + b;
}static int SUB(int a, int b)
{printf("SUB ! a-b=%d\n", a - b);return a - b;
}HandleDef handler = {ADD,SUB,FUN1,FUN2,
};int main()
{handler.fun1(22, 10);handler.fun2(2, 10);handler.add(3, 1);handler.sub(3, 1);return 0;
}

2、运行效果:

单片机

概述

       C语言结构体对函数指针封装示例(面向对象思想写法)

案例1:

1、示例:

#include <stdio.h>#define FUN_1 0U	//方法1:
#define FUN_2 0U	//方法2:
#define FUN_3 1U	//方法3:int i, j;struct DATE{int year;char month;char data;char hour;char min;char sec;
};
struct DATE date;struct str_func {int a;int b;void (*myPrintf)(void);void (*init_value)(void);void (*date_func)(void);
};void myPrintf(void) {printf("C语言结构体对函数指针封装示例 \r\n");
}void init_value(void) {i = 10;j = 20;
}void date_func(void)
{date.year = 2020;date.month = 03;date.data = 30;date.hour = 18;date.min = 01;date.sec = 25;
}//方法1:
#if FUN_1
struct str_func t_func = {.a = 5,.b = 6,.myPrintf = myPrintf,.init_value = init_value,.date_func = date_func,
};staic void fun(void)
{if (t_func.myPrintf){t_func.myPrintf();}if (t_func.init_value){t_func.init_value();printf("i=%d,j=%d \r\n", i, j);}if(t_func.date_func){t_func.date_func();printf("year:%d, month:%d, data:%d, hour:%d, min:%d, sec:%d \r\n",date.year,date.month,date.data,date.hour,date.min,date.sec);}
}
#endif
*///方法2:
#if FUN_2
void fun(void)
{struct str_func t_func = {.a = 5,.b = 6,.myPrintf = myPrintf,.init_value = init_value,.date_func = date_func,};t_func.myPrintf();t_func.init_value();printf("i=%d,j=%d \r\n", i, j);t_func.date_func();printf("year:%d, month:%d, data:%d, hour:%d, min:%d, sec:%d \r\n",date.year,date.month,date.data,date.hour,date.min,date.sec);
}
#endif//方法3:
#if FUN_3
struct str_func t_func;void fun(void)
{t_func.a = 5,t_func.b = 6,t_func.myPrintf = myPrintf,t_func.init_value = init_value,t_func.date_func = date_func,t_func.myPrintf();t_func.init_value();printf("i=%d,j=%d \r\n", i, j);t_func.date_func();printf("year:%d, month:%d, data:%d, hour:%d, min:%d, sec:%d \r\n",date.year,date.month,date.data,date.hour,date.min,date.sec);
}
#endifint main() {fun();    return 0;
}

2、运行结果:

案例2:

1、示例:(注:使用visual Studio2019编写)

// ConsoleApplication1.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>static void HW_Init(void);  //硬件初始化
static void Sys_Run(void);  //系统运行
static void IE_Init(void);  //中断初始化#define FUN_1  1u
#define FUN_2  0u#if FUN_1
typedef struct _HandleDef {void (*hw_init)(void);void (*sys_run)(void);void (*ie_init)(void);
}HandleDef;
#endif#if FUN_1// C++语言环境(在单片机上验证未通过)也有可能是编译器的问题,现在没时间去深究它,往后有时间深入研究看看。
HandleDef handler = {handler.hw_init = HW_Init,handler.sys_run = Sys_Run,handler.ie_init = IE_Init
};// C语言环境(在单片机上验证通过)
//HandleDef handler = {
//    .hw_init = HW_Init,
//    .sys_run = Sys_Run,
//    .ie_init = IE_Init
//};
#endif#if FUN_2struct HandleDef {void (*hw_init)(void);void (*sys_run)(void);void (*ie_init)(void);
};HandleDef handler = {HW_Init,Sys_Run,IE_Init
};
#endifstatic void HW_Init(void)
{std::cout << "HW_Init !\n";
}
static void Sys_Run(void)
{std::cout << "Sys_Run !\n";
}static void IE_Init(void)
{std::cout << "IE_Init !\n";
}int main()
{handler.hw_init();handler.ie_init();handler.sys_run();
}// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

 2、运行效果:

visual studio2019示例:a

案例3:

1、示例代码(IDE: cLion)

#include<stdio.h>
#include<stdlib.h>typedef int (*Operation)(int a, int b);typedef struct {int (*fun1)(int a, int b);void (*fun2)(int a, int b);Operation add; // 函数指针Operation sub; // 函数指针
}HandleDef;static int FUN1(int a, int b)
{printf("FUN1 ! a/b=%d\n", a / b);return a / b;
}
static void FUN2(int a, int b)
{printf("FUN2 ! a*b=%d\n", a * b);
}static int ADD(int a, int b)
{printf("ADD ! a+b=%d\n", a + b);return a + b;
}static int SUB(int a, int b)
{printf("SUB ! a-b=%d\n", a - b);return a - b;
}HandleDef handler = {ADD,SUB,FUN1,FUN2,
};int main()
{handler.fun1(22, 10);handler.fun2(2, 10);handler.add(3, 1);handler.sub(3, 1);return 0;
}

2、运行效果:

发布评论

评论列表 (0)

  1. 暂无评论