回调函数的使用:案例一:c语言简单信号与槽机制。
系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、回调函数
- 1.1 回调函数基本概念
- 1.2 简单实现
- 二、代码案例
- 1.代码示例
- 总结
前言
了解回调函数的基本概念,函数指针的使用、简单信号与槽的实现机制;
一、回调函数
1.1 回调函数基本概念
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针
(地址)作为参数传递
给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
A “callback” is any function that is called by another function which takes the first function as a parameter。
也就是说,函数 F1 调用函数 F2 的时候,函数 F1 通过参数给 函数 F2 传递了另外一个函数 F3 的指针,在函数 F2 执行的过程中,函数F2 调用了函数 F3,这个动作就叫做回调(Callback)
,而先被当做指针传入、后面又被回调的函数 F3 就是回调函数。
1.2 简单实现
创建函数指针,指向指定函数。
void hanshus1()
{cout <<"my hanshus1"<<endl;
}int hanshus2(int)
{cout <<"my hanshus2"<<endl;return 0;
}void (*hanshu1)();
int (*hanshu2)(int);
int main()
{hanshu1 = hanshus1;hanshu1(); // 输出 " my hanshus1 "hanshu2 = hanshus2;hanshu2(2); // 输出 “my hanshus2”
}
二、代码案例
简单实现信号与槽机制:
参考代码:
https://blog.csdn.net/weixin_41374099/article/details/115687655
1.代码示例
代码如下(示例):
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;#define MAX_SLOT_FUNCTION 20 //一个信号最多连接的槽函数数 //一个函数可以被任意多个信号连接//槽函数类型
typedef void (*slot_t)();//信号类型
typedef struct _signal_t
{slot_t slot[MAX_SLOT_FUNCTION];int count; //槽函数数量
}signal_t;//信号初始化
signal_t* signal();//添加槽函数
void connect(signal_t* _signal, slot_t _slot);//发射信号
void emit(signal_t* _signal);//销毁
void del(signal_t* _signal);//信号初始化
signal_t* signal()
{signal_t* s = (signal_t*)malloc(sizeof(signal_t));s->count = 0;for (int i = 0; i < MAX_SLOT_FUNCTION; ++i) {s->slot[i] = NULL;}return s;
}//添加槽函数
void connect(signal_t* _signal, slot_t _slot)
{_signal->slot[_signal->count] = _slot;++_signal->count;
}//发射信号
void emit(signal_t* _signal)
{for (int i = 0; i < _signal->count; ++i){slot_t func = _signal->slot[i];if (func != NULL) // {func();}}
}//销毁
void del(signal_t* _signal) {for (int i = 0; i < _signal->count; ++i){_signal->slot[i] = NULL;}_signal->count = 0;free(_signal);
}//准备几个槽函数!!!
void setup()
{static int i = 0;printf("setup > 我被点击了%d次,啊啊啊啊\n", ++i);
}void draw()
{static int i = 0;printf("draw > 我被点击了%d次,啊啊啊啊\n", ++i);
}void loop()
{static int i = 0;printf("loop > 我被点击了%d次,啊啊啊啊\n", ++i);
}void test()
{//自定义信号signal_t* clicked = signal();signal_t* moved = signal();connect(clicked, setup);connect(clicked, draw);connect(clicked, loop);connect(moved, setup);connect(moved, draw);//发射信号printf("---------------------------------------\n");emit(clicked);emit(clicked);printf("---------------------------------------\n");emit(moved);emit(moved);emit(moved);printf("---------------------------------------\n");emit(clicked);emit(clicked);emit(clicked);printf("---------------------------------------\n");}
int main()
{test();return 0;
}
运行截图:
总结
- 回调函数和普通函数的区别;
- 函数指针的使用
- 信号与槽的机制
相关文章:

回调函数的使用:案例一:c语言简单信号与槽机制。
系列文章目录 文章目录 系列文章目录前言一、回调函数1.1 回调函数基本概念1.2 简单实现 二、代码案例1.代码示例 总结 前言 了解回调函数的基本概念,函数指针的使用、简单信号与槽的实现机制; 一、回调函数 1.1 回调函数基本概念 回调函数就是一个通…...
python matplotlib库 设置字体字号等
主要是记录字体、字号对应的参数。注意字符串类型的参数要加引号 1.字体: fontname 常见参数: # 常用 Times New Roman、Dejavu sans、TeX Gyre Schola中文字体 黑体:SimHei 微软雅黑:Microsoft YaHei 微软正黑体:M…...

【MySQL】SQL性能分析 (七)
🚗MySQL学习第七站~ 🚩本文已收录至专栏:MySQL通关路 ❤️文末附全文思维导图,感谢各位点赞收藏支持~ 假如我们需要对SQL进行优化,我们就必须对他足够的了解,比如 对哪一类SQL进行优化(增删改查…...
超越想象的GPT医疗 20230723
7月份读完了这本书,趁着周末写下读书笔记吧 这本书 作者:【美】彼得.李 Peter Lee 【美】凯丽.戈德伯格CareyGoldberg 著 【美】伊萨克.科恩Isaac Kohane 芦义 译 在AI风起云涌时代,在这刚刚过去的新冠三年,“超越想象的GPT医…...
【N32L40X】学习笔记03-gpio输出库
gpio输出 该函数库的目的就是在统一的地方配置,将配置的不同项放置在一个结构体内部使用一个枚举来定义一个的别名 led.c #include <stdio.h> #include "led/bsp_led.h"static led_t leds[LED_NUM]{{GPIOB,GPIO_PIN_2,RCC_APB2_PERIPH_GPIOB},{GP…...

WebClient,HTTP Interface远程调用阿里云API
HTTP Interface Spring 允许我们通过定义接口的方式,给任意位置发送 http 请求,实现远程调用,可以用来简化 HTTP 远程访问。需要webflux场景才可 <dependency><groupId>org.springframework.boot</groupId><artifactId&…...

飞书ChatGPT机器人 – 打造智能问答助手实现无障碍交流
文章目录 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 在飞书中创建chatGPT机器人并且对话,在下面操作步骤中…...
React、Vue框架如何实现组件更新,原理是什么?
引言 React 和 Vue 都是当今最流行的前端框架,它们都实现了组件化开发模式。为了优化性能,两者都采用了虚拟DOM技术。当组件状态发生改变时,它们会使用虚拟DOM进行局部渲染比对,只更新必要的DOM节点,从而避免重新渲染整个组件树。本文将从React和Vue的组件更新原理入手,剖析两…...

常见面试题之设计模式--策略模式
1. 概述 先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。 作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进行开发&a…...
redis多key问题
多key问题指的是在Redis中存在大量的key,如果这些key过多,超过了Redis可以容纳的内存大小,那么数据会被保存在交换空间(swap区),这会导致性能下降。 Redis是一种基于内存的缓存数据库,它的性能…...

kafka第三课-可视化工具、生产环境问题总结以及性能优化
一、可视化工具 https://pan.baidu.com/s/1qYifoa4 密码:el4o 下载解压之后,编辑该文件,修改zookeeper地址,也就是kafka注册的zookeeper的地址,如果是zookeeper集群,以逗号分开 vi conf/application.conf 启…...

2_Apollo4BlueLite中断控制器NVIC
1.概述 Apollo4BlueLite 的中断控制器是采用 ARM Cortex-M4 内核,并集成了 NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)作为其中断控制器。 NVIC 是 ARM Cortex-M 系列处理器中常用的中断控制器,…...

WAIC2023:图像内容安全黑科技助力可信AI发展
目录 0 写在前面1 AI图像篡改检测2 生成式图像鉴别2.1 主干特征提取通道2.2 注意力模块2.3 纹理增强模块 3 OCR对抗攻击4 助力可信AI向善发展总结 0 写在前面 2023世界人工智能大会(WAIC)已圆满结束,恰逢全球大模型和生成式人工智能蓬勃兴起之时,今年参…...

微信小程序quickstartFunctions中云函数的应用
1、在quickstartFunctions文件中新建文件夹和文件 2、index.js 文件书写 const cloud require(wx-server-sdk);cloud.init({env: cloud.DYNAMIC_CURRENT_ENV }); const db cloud.database();// 链表查询试卷和对应的题库 exports.main async (event, context) > {retu…...
Go学习 2、程序结构
2、程序结构 2.1 命名 一个名字必须以一个字母或下划线开头,后面可以跟任意数量的字母、数字或下划线。 大写字母和小写字母是不同的。 GO语言有25个关键字,关键字不能用于自定义名字。 还有大约30多个预定义名字,对应内建的常量、类型和函…...

SpringBoot整合JavaMail
SpringBoot整合JavaMail 简单使用-发送简单邮件 介绍协议 导入坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>添加配置 spring:mail:host: smtp.qq.co…...

Spring6——入门
文章目录 入门环境要求构建模块程序开发引入依赖创建java类创建配置文件创建测试类运行测试程序 程序分析启用Log4j2日志框架Log4j2日志概述引入Log4j2依赖加入日志配置文件测试使用日志 入门 环境要求 JDK:Java17(Spring6要求JDK最低版本是Java17&…...

【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 17 日论文合集)
文章目录 一、检测相关(5篇)1.1 TALL: Thumbnail Layout for Deepfake Video Detection1.2 Cloud Detection in Multispectral Satellite Images Using Support Vector Machines With Quantum Kernels1.3 Multimodal Motion Conditioned Diffusion Model for Skeleton-based Vi…...

为什么需要GP(Global Platform)认证?
TEE之GP(Global Platform)认证汇总 一、为什么需要认证? 二、为什么是GP? 参考: GlobalPlatform Certification - GlobalPlatform...
eclipse 格式化代码 快捷键
在Eclipse中,可以使用以下快捷键来格式化代码: Windows/Linux快捷键:Ctrl Shift FMac快捷键:Command Shift F 按下相应的快捷键后,Eclipse将自动根据您的代码格式化偏好设置对代码进行格式化。请确保已经选择和配…...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...