回调函数的使用:案例一:c语言简单信号与槽机制。

news2024/12/29 8:23:28

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、回调函数
    • 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;
}

运行截图:
在这里插入图片描述


总结

  • 回调函数和普通函数的区别;
  • 函数指针的使用
  • 信号与槽的机制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/792115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

禾匠榜店商城小程序“商家付款至零钱”最新提现接口文件(替换原企业付款到零钱接口)替换说明

禾匠榜店商城使用过的会员都知道提现接口一直使用企业付款到零钱&#xff0c;老商户还能使用&#xff0c;但新开通微信支付的商户只能申请商家付款至零钱。老接口已不适应原来的提现方式&#xff0c;该接口文件适用禾匠榜店商城小程序4.5.14版本“商家付款至零钱”最新接口&…

Rust vs Go:常用语法对比(九)

题图来自 Golang vs Rust - The Race to Better and Ultimate Programming Language 161. Multiply all the elements of a list Multiply all the elements of the list elements by a constant c 将list中的每个元素都乘以一个数 package mainimport ( "fmt")func …

js版计算比亚迪行驶里程连续12个月计算不超3万公里改进版带echar

<!DOCTYPE html> <html lang"zh-CN" style"height: 100%"> <head> <meta charset"utf-8" /> <title>连续12个月不超3万公里计算LIGUANGHUA</title> <style> .clocks { …

IDEA以服务列表的形式展示

IDEA以服务列表的形式展示 要是没有要显示的服务列表的话就右键将启动的全部添加进去。正常是懒加载的形式&#xff0c;正常启动了就会添加进去。

超强阵容!HarmonyOS极客马拉松2023专家评审团来袭!

数十位重量级专家现身决赛现场&#xff0c;为参赛者提供多角度专业点评。12支队伍&#xff0c;46位选手&#xff0c;齐聚东莞松山湖&#xff0c;围绕HarmonyOS技术特性&#xff0c;共同挑战36小时极限编程&#xff0c;谁将问鼎决赛之巅&#xff0c;8.3日-5日&#xff0c;我们拭…

SLM实验室:新的RL研究基准和软件框架

计算和人才的增加使强化学习&#xff08;RL&#xff09;研究成为机器学习的热门领域 - 它已被用于解决自动驾驶汽车&#xff0c;机器人技术&#xff0c;药物发现等方面的问题。但是&#xff0c;找到一种方法来重现现有工作并准确评估迭代改进仍然是RL面临的一项艰巨挑战。 为了…

青少年中心:温湿度这个隐藏技巧,快速搞定环境安全

青少年是一个国家未来的重要资源&#xff0c;他们的成长环境对于塑造其积极向上的人生轨迹至关重要。在青少年中心&#xff0c;我们致力于提供一个安全、温馨的学习和交流空间&#xff0c;让青少年们得以充分发展自己的潜力。 为了确保青少年中心的环境始终符合健康标准&#x…

【技术宅提前活20年】如何用工业主机搭建一个个人网站

目录 引言 准备 部署 引言 随着网络技术的发展&#xff0c;摩尔定律的规律使得硬件的造价不再高昂。今天&#xff0c;安安就教大家如何用工业主机搭建一个个人网站。 效果展示 安城安的云世界 准备 1.小型工业主机一台 在网上可以买到~1000元左右可以买一台不错的。 2.内…

【C语言】函数----详解

&#x1f341; 博客主页:江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言——探索高效编程的基石 &#x1f4bb; 其他专栏&#xff1a;数据结构探索 &#x1f3e9;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa; 社区&#xff1a;C/C之家社区(欢迎大家加入与我一起…

iwatch怎么更改表盘样式 iwatch更改表盘样式方法

今年苹果终于带来了一个Apple Watch用户期待了已久的功能&#xff1a;第三方表盘&#xff0c;那么Apple Watch表盘如何更改、切换表盘还有如何调整表盘颜色设置等等&#xff0c;跟随小编一起来看看吧&#xff01; 详细的图文教程 如何在 Apple Watch 上切换表盘 在表盘上&…

如何在vue3中使用swiper插件(教程)

我的项目环境Vue3vitetsscss, 首先当然是下载依赖: pnpm install swiper10.0.4一定要下载正确的版本, 每个版本的使用差异还是有一些的 2.使用以下代码进行测试 <template> <div> <swiper :modules"modules" :navigation"true" :loop&qu…

牛客周赛 Round 4---游游的因子计算

输入 6 2 输出 6 1 2 3 4 6 12 解析&#xff1a; 如果一个数 x 是 a 的因子&#xff0c;y是b的因子&#xff0c;那么x*y一定是a*b的因子。 试除法分别获取a和b的因子&#xff0c;然后两层遍历的所有 a[ i ] * b[ j ] 的所有情况即为答案。 #include<bits/stdc.h> u…

python中出现形如‘break‘ outside loop错误

背景&#xff1a; 具体场景是我在使用PyQt5开发中&#xff0c;QMessage弹框收到特定信息后期望终止整个槽函数&#xff0c;当时想着就用了break这个关键字&#xff0c;期望终止整个函数执行&#xff0c;没想到报错break outside loop 大家如果没用过PyQt5也不用担心&#xff…

翻译新时代:借助文档翻译器开启全球交流之旅

在小雅家的客厅里&#xff0c;小雅正在和她的朋友小明聊天。小雅最近参加了一个国际学术会议&#xff0c;她发现了一些有趣的研究论文&#xff0c;但是其中一些是用外语写的&#xff0c;让她有些头疼。 小雅&#xff1a;小明&#xff0c;你知道文档翻译工具有哪些吗&#xff1…

从vtk/pcl源码中,分离pclVisilization 和 vtkQtWidget

背景: vtk和pcl是优秀的三维开源引擎, 但是我们在工程中,需要集成到我们软件中,因而有了QVtkOpenglWidget等直接嵌入Qt程序的要求; 但是从vtk8.2之后,这部分源码又剔除出去了,随之影响的还有pcl 8.0系列之后的版本; 那么升级就遇到问题了, 如果在版本之前的编译我们还好说,但…

基于SpringBoot的开源项目/demo汇总

一些基于SpringBoot的开源项目&#xff0c;方便大家学习&#xff0c;参考。持续更新&#xff0c;排名不分先后。也欢迎贡献&#xff08;回复此贴&#xff09;。 1、GitHub - Tencent/APIJSON: &#x1f3c6; 零代码、全功能、强安全 ORM 库 &#x1f680; 后端接口和文档零代码…

Power apps:做个弹窗

首先需要添加一个组件 接着在组件里插入一个矩形&#xff0c;背景我设为了白色&#xff0c;添加弹窗的内容&#xff0c;比如label&#xff0c;按钮之类的&#xff0c;覆盖在矩形上方 回到应用中&#xff0c;在需要出现弹窗的窗口插入这个自定义组件&#xff0c;设置它的Visible…

【Linux后端服务器开发】IP协议

目录 一、IP协议概述 二、协议头格式 三、网段划分 四、IP地址的数量限制 五、路由 一、IP协议概述 主机&#xff1a;配有IP地址&#xff0c;但是不进行路由控制的设备 路由器&#xff1a;即配有IP地址&#xff0c;又能进行路由控制 节点&#xff1a;主机和路由器的总称…

#Gitee 的 WebHooks 实现代码自动化部署#

1:安装git 2:php同步脚本 3:配置webhook 一&#xff1a;安装git服务 // 查看是否安装了git git --version// 如果未安装&#xff0c;执行安装命令 yum install git 2&#xff1a;编写同步PHP脚本 <?php //理发店钩子 error_reporting(1); set_time_limit(0); // 部署目…

AI 视频清晰化CodeFormer-Deepfacelab

CodeFormer 概述 (a) 我们首先学习一个离散码本和一个解码器&#xff0c;通过自重建学习来存储人脸图像的高质量视觉部分。(b) 使用固定的码本和解码器&#xff0c;我们引入了一个用于代码序列预测的 Transformer 模块&#xff0c;对低质量输入的全局人脸组成进行建模。此外&a…