admin管理员组

文章数量:1794759

单片机

单片机

概述

       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); } #endif int 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_2 struct HandleDef { void (*hw_init)(void); void (*sys_run)(void); void (*ie_init)(void); }; HandleDef handler = { HW_Init, Sys_Run, IE_Init }; #endif static 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、运行效果:

本文标签: 单片机