函数指针和回调函数

一文讲透什么是ADC/DAC中的DDC、DUC、采样率以及数据率等概念 摘要:ADC/DAC中的采样率与数据率概念不同,采样率是转换器的时钟速率,而数据率是数字输出的实际速率。抽取通过滤波降低数据速率,提升信噪比但牺牲带宽;内插则通过插零和滤波提高采样率,将镜像信号移远但增加延迟和功耗。JESD204B标准的高速转换器需平衡通道数与串行速率,内插/抽取技术是关键。文章还解析了DDC、DUC的应用及优缺点,为高速数据转换设计提供参考。(150字) 阅读详情

C++很多类库都喜欢用回调函数,MFC中的定时器,消息机制,hook机制等待,包括现在在研究的cocos2d-x中也有很多的回调函数。


1.回调函数

什么是回调函数呢?回调函数其实就是一个通过函数指针调用的函数!假如你把A函数的指针当作参数传给B函数,然后在B函数中通过A函数传进来的这个指针调用A函数,那么这就是回调机制。A函数就是回调函数,而通常情况下,A函数是系统在符合你设定条件的情况下会自动执行,比如Windows下的消息触发等等。那么调用者和被调用者的关系就被拉开了,就像是中断处理函数那样。


2.函数指针

函数指针是一个指针,只是这个指针它不像普通的指针指向是是一个变量,此时它指向的是一个函数,也就是它存储的是一个函数的地址,如果我们愿意的话,可以改变这个它的值,让他由指向funA转变为指向funB,那么这个函数指针的作用就改变了。


3.函数指针的使用


3.1函数指针声明

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. typedef 返回类型(*函数指针类型名)(函参列表);  


3.2示例

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. typedef void(*Fun)(int,int); //定义函数指针类型  
  2. void min(int a,int b);  
  3. void max(int a,int b);  
  4.   
  5. void min(int a,int b)  
  6. {  
  7.     int minvalue=a<b?a:b;  
  8.     std::cout<<"min value is "<<minvalue<<"\n";  
  9. }  
  10.   
  11. void max(int a,int b)  
  12. {  
  13.     int maxvalue=a>b?a:b;  
  14.     std::cout<<"Max value is "<<maxvalue<<"\n";  
  15. }  
  16.   
  17. int _tmain(int argc, _TCHAR* argv[])  
  18. {  
  19.     Fun pFun=NULL; //定义函数指针变量pFun  
  20.     //pFun=min;//两种赋值方式都支持  
  21.     pFun=&min;  
  22.     pFun(1,2);//这里获得最小值  
  23.     //pFun=max;  
  24.     pFun=&max;  
  25.     pFun(1,2);//这里获得最大值  
  26.     return 0;  
  27. }  
我想这么写应该是很一目了然了。


4.回调函数的使用

回调函数的使用其实和上面函数指针示例是很一致的,只是上面的实例中pFun是我们自己调用的。现在我们在MFC中让系统调用一下吧。


先看一下SetTimer函数声明:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. UINT SetTimer( UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT* lpfnTimer)(HWND, UINT, UINT, DWORD) );  
其中lpfnTimer是这么解释的:Specifies the address of the application-supplied TimerProc callback function that processes the WM_TIMER messages. If this parameter is NULL, the WM_TIMER messages are placed in the application's message queue and handled by the CWnd object.

也就是或如果为NULL的话,系统自动触发WM_Timer消息,然后调用OnTimer函数。


我们调用自己的自定义回调函数。

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. CALLBACK VOID callback_fun(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)  
  2. {  
  3.     TRACE("CallBack\n");//debug下运行控制台输出CallBack  
  4. }  
  5.   
  6. void CTestCallBackDlg::OnBnClickedButton1()  
  7. {  
  8.     // TODO: 在此添加控件通知处理程序代码  
  9.     SetTimer(1,1000,(TIMERPROC)callback_fun);//每一秒回调一次  
  10. }  

另外,需要注意的是回调函数必须是全局函数或者静态成员函数,因为普通的成员函数会隐含着一个传递函数作为参数,也就是this指针。因此如果使用普通成员函数作为回调函数的话会导致函数参数个数不匹配,因此编译失败。这也是线程函数是多为静态函数的原因。

我们还注意到回调函数用CALLBACK修饰,我们可以在windef.h中发现:

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #define CALLBACK    __stdcall  
CALLBACK其实就是__stdcall,还记得上篇讲过的函数调用约定吗?
别再花钱买插件了!手把手教你实现UE5运行时动态导入FBX模型(附完整源码解析) 本文详细解析了UE5运行时动态导入FBX模型的全过程,从FBX SDK集成配置到核心解析流程,再到引擎资源转换和性能优化。通过多线程加载架构和内存优化技巧,开发者可以高效实现动态模型导入,避免购买昂贵插件。文章还提供了完整源码解析和高级功能扩展,帮助开发者深入理解UE5的底层资源管理机制。 阅读详情

相关推荐

如何搭建pikachu靶场

Pikachu靶场本地搭建指南 下载安装PHPStudy并启动Apache/MySQL服务 获取Pikachu靶场源码并解压到网站根目录 配置数据库连接信息(修改config.inc.php文件) 创建pikachu数据库(用户名/密码设为root) 访问http://localhost/pikachu测试功能 常见问题:数据库连接失败需检查服务状态和配置信息,页面报错需检查PHP版本兼容性。建议使用PHP7.3/7.4版本,在隔离环境中搭建使用。 (150字)

2401_85351702的博客 1277

C++学习之回调函数

参考文献 1. 什么是回调函数 回调函数就是通过函数指针调用函数。如果把函数的指针或者地址作为参数传递给另一个参数,当这个指针被用来调用其所指向的函数时,那么这就是一个回调的过程,这个被回调的函数就是回调函数。回调函数不是有该函数的实现方直接调用,而是在特定的事件或者条件发生时由另外的一方调用的,用于对该事件或者条件进行响应。回调函数就是在两个独立函数或者独立类通信的通道。 举个例子: 财务处是负责对公司财务状况和每个月的开销进行汇总 老板只会去看每个月的报表 那么在这个当中,老板不会去关心,财务整个汇总的

HAH--M的博客 1万+

【STM32】STM32 CANFD外设的几种消息接收过滤模式

在控制器区域网络(CAN)系统中,正确配置消息过滤器对于有效管理网络通信至关重要。特别是在使用Flexible Data-rate Controller Area Network(FDCAN)时,选择合适的过滤器类型可以大大提高网络效率和消息处理速度。

林愿留的博客 6230

C++回调函数

如果你把函数的指针(地址)作为参数传递给另一个函数,回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。p指向Max函数之后,然后用p调用Max函数,返回两个数中的最大值。特别注意的是,因为函数名本身就可以表示该函数地址(指针),因此在获取函数指针时,可以直接用函数名,也可以取函数的地址。前面函数指针的方式作为回调函数的一种方式,可以同时用于C和C++,下面介绍另外的一些方式,因为C++引入了对象的概念,可以使用类的成员和静态函数作为回调函数。

mayue_web的博客 5092

windows的rancherDesktop修改镜像源

Rancher Desktop中的“Allowed Images”功能(通常在 Preferences -> Container Engine -> Allowed Images 中找到)是用来定义一个允许拉取和推送的镜像列表的规则,例如,只允许从您组织或特定的受信任的仓库中获取镜像。如果问题依旧,请提供您Rancher Desktop的版本和当前选择的容器运行时,以便进一步协助。总结一下,对于Windows上的Rancher Desktop,如果您使用默认的。,镜像源的配置通常通过一个名为。

zwjapple的专栏 2700

【mip-NeRF】使用一组二维图像渲染3D场景视频(mip-NeRF论文复现)

本文对mip-NeRF模型的pytorch实现进行了复现

Ryan2k的博客 1849

【C++】C++回调函数基本用法(详细讲解)

回调函数可以被简单地理解为:A函数作为参数传递给B函数,然后B函数在执行的某一时刻调用A函数。这里的A函数就是回调函数。

测试开发自动化 1万+

使用MCAL的Fee模块集成ETAS存储协议栈

由于ETAS Fee模块导致初始化时间较长,且集成占用的内存较大,所以最终考虑使用MCAL中的Fee模块来集成ETAS的Nvm模块,本文介绍具体的集成方法注意:本文所涉及的集成前提是原有的ETAS协议栈已正常使用使用IFX Fee需要手动配置Fee,可能有出错的风险,最好是利用脚本自动生成代码来实现。另外,需要注意IFX的Fee中block数据没有CRC校验,如果使用该Fee,建议Nvm中加CRC校验(ETAS Fee中block自带CRC,可以不需要Nvm Crc),防止数据被意外篡改导致的异常。

赞的博客 404

C++-回调函数

1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义。我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类似这么一个场景来说明:A君去B君店里买东西,恰好缺货,A君留下号码给B君,有货时通知A君。感觉这个让人更容易想到的是异步操作,而不是回调。另外还有两句英文让我印象深刻:1) If you call me, I will call you back; 2) Don't call me, I will call

m0_52902391的博客 4259

PyTorch深度学习实战(4)——常用激活函数和损失函数详解

激活函数和损失函数是深度学习模型中重要组成部分,激活函数和损失函数的选择很大程度上决定了深度神经网络的性能和精度,需要根据具体问题的特点和数据分布等因素进行选择。在本节中,将介绍深度学习中常见的激活函数和损失函数,并说明不同函数的常见应用场景。

盼小辉丶的博客 1万+

YOLOv13添加轻量化的EMA模块Faster_EMA,轻量又涨点!map50提升4.56个点,召回率提升9.66!

本文介绍了YOLOv13模型的优化移植方法,通过添加Faster_EMA模块和超参数调整,使模型性能显著提升。主要修改包括:1) 创建新的模型配置文件yolov13-Faster_EMA.yaml;2) 在tasks.py中添加新模块;3) 修改__init__.py和block.py文件,新增Partial_conv3和DropPath类。优化后模型mAP50提升4.56%,召回率提升9.66%,验证了改进方案的有效性。代码实现了局部卷积和随机深度等先进技术,为YOLO系列模型性能优化提供了新思路。

FJN110的博客 2605

C语言中函数指针和回调函数的详解

函数指针:指向函数的指针变量。 因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。函数指针有两个用途:调用函数和做函数...

weixin_39939425的博客 8万+

Amesim应用篇-电芯等效电路模型标定

为了使计算模型更加准确,在有电芯实验测试数据的情况下,依据现有的实验数据对Amesim中的电池等效电路模型进行标定。标定的目的是为了获得更加符合项目实际情况的电芯等效电路模型,标定完的电芯可以用于搭建PACK模型,也可以用于其他虚拟实验。本文以充电标定为例,进行介绍。放电标定与充电一致。

2201_75375391的博客 1213

C++函数指针和回调函数

什么是函数指针 函数指针就是指向函数的指针,指向某种特定的类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关,例如: bool lengthCompare(const string &amp;amp;, const string &amp;amp;); 该函数类型是bool (const string &amp;amp;, const string &amp;amp;)。 如何声明一个指向该函数的指针?只需要用指针...

華仔的博客 3436

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

回调函数和函数指针

回调函数和函数指针   最近在看代码,写代码的人很喜欢用回调函数和函数指针。一直觉得回调函数和函数指针挺神秘的,所以查了一些资料,来与大家一起来分享。 什么是回调函数 简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。 为什么要使用回调函数    因为使用

pirate97的专栏 9651

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

函数指针C++和回调函数

C++中的函数指针和函数对象总结 篇一、函数指针 函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。 函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数。 函数指针的声明方法: 数据类型标志符 (指针变量名) (形参列表); 一般函数的声明为:  int func ( int x ); 而一个函

u011473714的专栏 1316

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

函数指针和回调函数、回调函数的概念及其用途

函数指针和回调函数、回调函数的概念及其用途函数指针和回调函数是C语言中两个密切相关的概念,它们共同增强了程序的灵活性和可扩展性。首先,函数指针就是一个指向函数的指针,它的本质是一个指针,指向一个函数的代码段。通过使用typedef,我们可以先自定义函数指针类型,再用自定义类型来声明函数指针变量。例如,就定义了一个函数指针类型FunPtr,它指向的函数接收一个类型的参数,并返回一个size_t类型的值。而回调函数则是指在某个特定事件发生或条件满足时,由程序自动调用的函数。

Layla_c的博客 1065

指针函数和函数指针 函数指针数组 回调函数

我们经常使用的函数定义的方式是(类型名 标识符 (形参列表) {函数体})指针函数的定义其实也并无不同,我们定义的方式也是(类型名 标识符 (形参列表) {函数体})只不过使用的是指针类型。int* ret(int x,int y) {} 或者 int *ret(int x,int y) {}怎么去写看个人习惯,并无区别。这么看来其实也是比较简单,和普通函数的定义并没有什么大的区别,也就是多了一个* ,仅此而已。

C++领域内容分享 389

函数指针和回调函数以及返回指向函数的指针

函数指针指向的是函数而非对象。和其他类型一样,函数指针指向某种特定类型。因为函数的类型由它的返回类型和形参类型共同决定,与函数名无关,所以想要声明一个函数指针,只需要用指针替换函数名即可,例如:比较字符串长度的函数:bool LengthCompare(const string &amp;, const string &amp;);此函数的函数指针为: bool (*pf)(c...

QuinnHanz的博客 8503

回调函数和函数指针用法

最近与公司大佬交流过程学习到新的知识再次记录:https://www.runoob.com/w3cnote/c-callback-function.html 函数指针和回调函数用法如下,在此仅做记录: 1、函数指针类型:函数返回值类型 (* 指针变量名) (函数参数列表); 例如:int(*p)(int, int); 用法: int Max(int x, int y); //定义Max函数 c = (*p)(a, b); //通过函数指针调用Max函数 1、回调函数无参数: intCallbac...

qq_39758638的博客 460
上一篇: 冲突域和广播域的区分
下一篇: errno、stderr、perror函数和strerror函数
big_bit
博客等级 码龄11年 67粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值