VC中回调函数的用法

STM32F407ZGT6实战:ST-LINK烧录、串口通信与舵机PWM控制详解 在嵌入式系统开发中,掌握调试接口与通信协议是硬件工程师的必备技能。ST-LINK作为ARM Cortex-M内核芯片的主流调试器,通过SWD接口实现程序下载与在线调试;USB转TTL模块则承担着单片机与PC之间串口通信的桥梁作用。两者协同工作,构成了STM32开发的基础调试环境。而舵机作为典型的PWM控制设备,其角度控制依赖于精确的脉宽调制信号,这需要开发者深入理解定时器的预分频与比较值计算。从基础接线到固件烧录,再到串口验证与舵机控制,本文以STM32F407ZGT6为例,系统梳理了ST-LINK四线连接 阅读详情


回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就

是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可

以在回调函数里完成你要做的事。

 

  前些天写一个可编辑的ListCtrl类时,遇到这样一个问题,在ListCtrl的指定格中创建了一个Button,创建过程我写在

ListCtrlButtuon.cpp中,在对外提供的接中类CMMListCtrl中这样调用:

void SetButtonEx(int iColumn, int iRow, int iIndex, int (*)(CWnd *pWnd, int iItem, int iSubItem));

这样设计的思想是,当单击Button时,相应的消息处理在调用者自己的类中,不须要改动CListCtrlButton类来响应用户的具体处理,非常灵活.这一过程如上面所看到的,用到了回调函数.下面简单做下总结:

 1.在ListCtrlButton.h头部中定义回调函数指针:

   typedef int (*EditCallFunc)(CWnd *, int, int);

 2.在CListCtrlButton类中定义:

   EditCallFunc m_func;

 3.然后在OnClicked()消息响应中应用此函数:

   void CListCtrlButton::OnClicked()

   {  

    m_func(m_pParentList, m_iItem, m_iSubItem);

    OnEditEnd();

    }

  4.在我封装的MMListCtrl接口类中这样使用:

 // MMListCtrl.h中

  void SetButtonEx(int iColumn, int iRow, int iIndex, int (*)(CWnd *pWnd, int iItem, int iSubItem));

 

 //MMListCtrl.cpp中

/*********************************************************************

* 函数名称:SetButtonEx

* 说明:将指定方格格设为Button,有关点击Button后的相应操作应根据实际情况添加

* 入口参数:

* int iColumn       -- 指定格所在的列

* int iRow          -- 指定格所在的行

* int iIndex        -- 用于区分不同的Button (iIndex = 0, 1, 2,...)

* int (*fSetClickButton)(CWnd *, int , int)

                    --函数指针,指向实现函数

* 返回值:

* void              --

* 作者: Duanyx

* 时间: 2008-04-10 11:40:50

* 修改: 如果不用iIndex,采用二维数组存放如果行数超过一定值发生stack overflow

*********************************************************************/

 

void CMMListCtrl::SetButtonEx(int iColumn, int iRow, int iIndex, int (*fSetClickButton)(CWnd *, int, int))

{  

    if (m_ListCtrlButton[iIndex].m_hWnd == NULL)

    {

        m_ListCtrlButton[iIndex].CreateEx(this->GetParent(), this);

        m_ListCtrlButton[iIndex].Insert(iColumn, iRow);

        m_ListCtrlButton[iIndex].m_func = fSetClickButton;     

    }

    else

    {

        m_ListCtrlButton[iIndex].Insert(iColumn, iRow);

        m_ListCtrlButton[iIndex].m_func = fSetClickButton;

    }  

}

 

5.下面就是用户类中调用的使用,假设已经声明CMMListCtrl m_List;

在用户类EditListCtrlDlg.h的头部声明:

int SetMyDlg2(CWnd *pWnd, int iItem, int iSubItem);

//EditListCtrlDlg.cpp中

BOOL CEditListCtrlDlg::OnInitDialog()

{

    CDialog::OnInitDialog();

 

       //注意最后一个参数为函数指针

       m_List.SetButtonEx(0, 0, 1, SetMyDlg);

}

 

//最后是此函数的实现

int SetMyDlg2(CWnd *pWnd, int iItem, int iSubItem)

{

    CString strText;

    COleTest dlg;

 

    if (dlg.DoModal() == IDOK)

    {

        strText = "dyx1024@gmail.com";

    }

    ((CListCtrl *)pWnd)->SetItemText(iItem, iSubItem, strText);

    return 0;

}

 

------------------------------------------------------------------------------------------------------

在书写的过程中参考了网上好多资料,附于此处,以便读者能更好的理解回调函数的使用.

 

参考资料一:

 

回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就

是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可

以在回调函数里完成你要做的事。

 

capVideoStreamCallback 这个回调函数,我没有做过,看了一下Help,应该是通过发送消息

WM_CAP_SET_CALLBACK_VIDEOSTREAM,来设置的,或者调用宏capSetCallbackOnVideoStream

来完成的。这样设定之后,系统在进行图像捕捉的过程中,就会自动调用你写的回调函数。

 

这个回调函数的函数体需要你自已来写,然后在另一函数中调用,即是说:

LRESULT CALLBACK capVideoStreamCallback(HWND hWnd,LPVIDEOHDR lpVHdr)

{

 ........

}

//在另一函数中调用它(即以capVideoStreamCallback的地址作为一参数)

Function(1,......,capVideoStreamCallback,.....);

这就好像我们用定时器一样,在设置定时器时需要为定时器设置一回调函数:

::SetTimer(m_hWnd,1,1000,(TIMERPROC)TMProc);这里的TMProc就是回调函数

 

 

模块A有一个函数foo,它向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事情,让A作出相应反应。

    那么我们就把foo称为回调函数。

 

    “这个回调函数不是VFW.h中声明的么,“

    ----那是声明了回调函数原型,是告诉你传递进来的回调函数必须和它定义的原型保持一致。

 

    ”为什么要自己写函数体呢?“

    ----比如在上面模块B里面,它只知道当event发生时,向模块A发出通知,具体怎么回应这个事件,不是B所关心的,也不是B所能预料到的。

    你站在A的角度上思考,当然要你自己作出对event的反应,也就是你要自己写函数体。

 

    你如果明白了C++里面的函数指针,就很容易理解回调函数了。

 

"不知道系统调用后有什么结果,或者我怎么利用这个结果啊"

---如果你向系统传递一个回调函数地址,那么你的程序就相当于上面我说的模块A,系统就相当于模块B,系统只是调用你的函数,它根本不可能知道会有什么结果。

   你怎么利用这个结果,看你是怎么定义这个回调函数的。     

回调函数和回调机制是不同的概念,。,,函数是被调用的,但是回调机制在不同的语言中不都是以函数指针来实现的。。。。比如c#...一般的在windows api 中,会调都是使用函数指针实现的。。。

 

参考资料二:

回调函数是一个很有用,也很重要的概念。当发生某种事件时,系统或其他函数将会自动调用你定义的一段函数。回调函数在windows编程使用的场合很多,比如Hook回调函数:MouseProc,GetMsgProc以及EnumWindows,DrawState的回调函数等等,还有很多系统级的回调过程。本文不准备介绍这些函数和过程,而是谈谈实现自己的回调函数的一些经验。

 

之所以产生使用回调函数这个想法,是因为现在使用VC和Delphi混合编程,用VC写的一个DLL程序进行一些时间比较长的异步工作,工作完成之后,需要通知使用DLL的应用程序:某些事件已经完成,请处理事件的后续部分。开始想过使用同步对象,文件影射,消息等实现DLL函数到应用程序的通知,后来突然想到可不可以在应用程序端先写一个函数,等需要处理后续事宜的时候,在DLL里直接调用这个函数即可。

 

于是就动手,写了个回调函数的原形。在VC和 Delphi里都进行了测试

 

一:声明回调函数类型。

   VC 版   typedef int (WINAPI *PFCALLBACK)(int Param1,int Param2) ;

 

   Delph版 PFCALLBACK = function(Param1:integer;Param2:integer):integer;stdcall;

 

   实际上是声明了一个返回值为int,传入参数为两个int的指向函数的指针。

   由于C++和PASCAL编译器对参数入栈和函数返回的处理有可能不一致,把函数类型用WINAPI(WINAPI宏展开就是__stdcall)或stdcall统一修饰。

 

 

二:声明回调函数原形

    声明函数原形

      VC 版      int WINAPI CBFunc(int Param1,int Param2);

      Delphi 版  function CBFunc(Param1,Param2:integer):integer;stdcall;

 

  以上函数为全局函数,如果要使用一个类里的函数作为回调函数原形,把该类函数声明为静态函数即可。

 

 

三: 回调函数调用调用者

 

调用回调函数的函数我把它放到了DLL里,这是一个很简单的VC生成的WIN32 DLL.并使用DEF文件输出其函数名 TestCallBack。实现如下:

PFCALLBACK  gCallBack=0;

void WINAPI TestCallBack(PFCALLBACK Func)

{

  if(Func==NULL)return;

  gCallBack=Func;

  DWORD ThreadID=0;

  HANDLE hThread = CreateThread(

    NULL,

    NULL,

    Thread1,

    LPVOID(0),

    &ThreadID

  );

 

  return;

}

 

此函数的工作把传入的 PFCALLBACK Func参数保存起来等待使用,并且启动一个线程。声明了一个函数指针PFCALLBACK gCallBack保存传入的函数地址。

 

四:回调函数如何被使用:

TestCallBack函数被调用后,启动了一个线程,作为演示,线程人为的进行了延时处理,并且把线程运行的过程打印在屏幕上.

本段线程的代码也在DLL工程里实现

ULONG  WINAPI Thread1(LPVOID Param)

{

  TCHAR Buffer[256];

  HDC hDC = GetDC(HWND_DESKTOP);

  int Step=1;

  MSG Msg;

  DWORD StartTick;

  //一个延时循环

  for(;Step<200;Step++)

  {

    StartTick = GetTickCount();

    /*这一段为线程交出部分运行时间以让系统处理其他事务*/

    for(;GetTickCount()-StartTick<10;)

    {

      if(PeekMessage(&Msg,NULL,0,0,PM_NOREMOVE) )

      {

        TranslateMessage(&Msg);

        DispatchMessage(&Msg);

      }

    }

    /*把运行情况打印到桌面,这是vcbear调试程序时最喜欢干的事情*/

    sprintf(Buffer,"Running %04d",Step);

    if(hDC!=NULL)

      TextOut(hDC,30,50,Buffer,strlen(Buffer));

  }

 

  /*延时一段时间后调用回调函数*/

  (*gCallback)(Step,1);

 

  /*结束*/

  ::ReleaseDC (HWND_DESKTOP,hDC);

  return 0;

}

 

五:万事具备

  使用vc和Delphi各建立了一个工程,编写回调函数的实现部分

  VC 版

   int WINAPI CBFunc(int Param1,int Param2)

   {

      int res= Param1+Param2;

      TCHAR Buffer[256]="";

      sprintf(Buffer,"callback result = %d",res);

      MessageBox(NULL,Buffer,"Testing",MB_OK);  //演示回调函数被调用

      return res;

   }

 

   Delphi版

    function CBFunc(Param1,Param2:integer):integer;

    begin

        result:= Param1+Param2;

        TForm1.Edit1.Text:=inttostr(result);    / /演示回调函数被调用

    end;

 

  使用静态连接的方法连接DLL里的出口函数 TestCallBack,在工程里添加 Button( 对于Delphi的工程,还需要在Form1上放一个Edit控件,默认名为Edit1)。

  响应ButtonClick事件调用 TestCallBack

 

  TestCallBack(CBFunc) //函数的参数CBFunc为回调函数的地址

  函数调用创建线程后立刻返回,应用程序可以同时干别的事情去了。现在可以看到屏幕上不停的显示字符串,表示dll里创建的线程运行正常。一会之后,线程延时部分结束结束,vc的应用程序弹出MessageBox,表示回调函数被调用并显示根据Param1,Param2运算的结果,Delphi的程序edit控件里的文本则被改写成Param1,Param2 的运算结果。

 

  可见使用回调函数的编程模式,可以根据不同的需求传递不同的回调函数地址,或者定义各种回调函数的原形(同时也需要改变使用回调函数的参数和返回值约定),实现多种回调事件处理,可以使程序的控制灵活多变,也是一种高效率的,清晰的程序模块之间的耦合方式。在一些异步或复杂的程序系统里尤其有用 -- 你可以在一个模块(如DLL)里专心实现模块核心的业务流程和技术功能,外围的扩展的功能只给出一个回调函数的接口,通过调用其他模块传递过来的回调函数地址的方式,将后续处理无缝地交给另一个模块,随它按自定义的方式处理。

 

  本文的例子使用了在DLL里的多线程延时后调用回调函数的方式,只是为了突出一下回调函数的效果,其实只要是在本进程之内,都可以随你高兴可以把函数地址传递来传递去,当成回调函数使用。

 

 这样的编程模式原理非常简单单一:就是把函数也看成一个指针一个地址来调用,没有什么别的复杂的东西,仅仅是编程里的一个小技巧。至于回调函数模式究竟能为你带来多少好处,就看你是否使用,如何使用这种编程模式了。

vc DLL中使用回调函数 dll typedef void(__stdcall *Callback_GetYUV420P)( unsigned char * ); typedef void(__stdcall *Callback_GetH264Stream)( unsigned char * ,int ); Callback_GetYUV420P pfun; Callback_GetH264Stream pfun2;... 阅读详情

相关推荐

VC++回调函数

绝对可以运行VS2008编译通过,很简单的回调函数例子,该回调函数封装在DLL中可以供C# C++调用

VC 回调函数及使用方法

VC 回调函数及使用方法 回调函数说白了就是事件响应程序,Windows的每个消息可以理解为一个事件,事件的响应代码要由用户自己来定义。用户定义了事件响应的代码,但还要Windows知道这段代码的位置(要不然Windows就不知道如何去调用,这也没有用),于是用户需要将回调函数的指针告诉Windows,最典型的例子是在窗口类的结构(WNDCLASS)中给lpfnWndProc分量赋回调函数指针

xingyu2006的专栏 1万+

VC++ 回调函数使用实例

回调函数的理论我说不上多少,但以前给同事写的类中用到过,这次面试中又被问到相关的理论,故将其摘录出来,做一个实例,以后参考。

Visual C++中回调函数使用的变身大法

对于回调函数的编写始终是写特殊处理功能程序时用到的技巧之一。先介绍一下回调的使用基本方法与原理。  1、在这里设:回调函数为A()(这是最简单的情况,不带参数,但我们应用的实际情况常常很会复杂),使用回调函数的操作函数为B(), 但B函数是需要参数的,这个参数就是指向函数A的地址变量,这个变量一般就是函数指针。使用方法为: int A(

桂林哈秋 - 我想学编程 1171

【EPICS学习记录】根据官方教程创建一个IOC应用

参照官网给出的IOC创建教程逐步操作完成了一个IOC应用的创建,官网教程中有部分过程表述的不清晰,自己摸索之后完成了IOC的创建,并把流程记录下来。其中有一些操作不是很理解,有问题或者建议欢迎指正。

yifeng_H的博客 3661

基于ThingsBoard+ESP8266的MQTT远程控制实战:从设备接入到仪表盘交互

本文详细介绍了基于开源物联网平台ThingsBoard与ESP8266开发板,通过MQTT协议实现远程控制的完整实战流程。从环境搭建、设备创建、仪表盘设计到核心代码编写与联调,手把手指导完成从云端到硬端的物联网闭环,为智能家居与物联网原型开发提供低成本、高效率的解决方案。

weixin_29192365的博客 330

Vc 中回调函数简要说明

Vc 中回调函数简要说明如:void CALLBACK OnProcessData);函数申明中加上CALLBACK就表示该函数为回调函数。 凡是由你设计却由windows系统呼叫的函数,统称为callback函数。 但这么说又对回调的理解局限了些。 回调函数和普通函数没什么区别,只是使用上的区别。回调是一种解决问题的

图像识别讨论学习 1122

从零开始:EAS2+Elmo+Maxon电机调试全流程(含电流环优化技巧)

本文详细解析了从零开始搭建基于EAS2软件、Elmo驱动器和Maxon电机的运动控制系统的全流程。内容涵盖硬件连接规范、EAS2基础配置、核心的电流环模型辨识与手动优化技巧,以及速度环、位置环的搭建与调试策略,旨在帮助工程师构建稳定、高性能的伺服控制核心。

i0j1k2l3m的博客 502

C/C++回调函数的使用

C/C++回调函数使用前言回调函数也是普通函数C回调函数C++回调函数使用场景描述C++回调函数定义静态成员函数访问非静态成员函数的方法回调对象更复杂的讨论 前言 本文系转载,个人感觉写得比较不错,笔者对回调函数理解比较透彻,请支持原创。 链接:https://blog.youkuaiyun.com/sinat_38183777/article/details/83958887 回调函数也是普通函数 首先明确一个概念,回调函数也是普通函数,而不是什么神秘的东西。至于为什么叫回调函数,是因为程序通过参数把该函数的函数指针

junjun6022的博客 923

2025年广东省职业院校技能大赛高职组“区块链技术应用”正式赛题解析答案(标准答案参阅)

某公司规划开发一个区块链供应链金融平台,包括核心企业、供应商、银行等角色,通过智能合约代码逐步构建区块链供应链金融平台的基本功能,实现银行向核心企业提供授信并发行数字凭证,企业与企业之间转让数字凭证。此外需要完成区块链供应链金融平台的前后端,实现基本的业务逻辑

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 1270

拉曼光谱入门:10.显微拉曼与共聚焦技术

本文系统阐述了显微拉曼光谱技术与共聚焦原理的融合机制,详细解析了从激光激发、针孔空间滤波到光谱采集的完整光路架构,阐明了共聚焦设计在提升三维空间分辨率、抑制荧光背景及实现微区无损层析方面的核心优势,并探讨了关键光学器件的性能边界与系统技术局限。

qq_53529450的博客 166

VC/MFC中使用回调函数 关于回调函数的作用

这些天在练习的时候,很多在win32控制台里了回调函数。再次基础上移植到VC/MFC中的时候发现有点问题,于是查阅资料,解决方法如下(直接代码): 不过我在查阅资料的时候,看见有的朋友说回调函数需要被定义为CALLBACK(这是一个宏),遗憾我不知道具体怎么用。 typedef void (*cback)(int a,LPVOID  userParam);    //回调函数原型定义

LJH0600301217的专栏 2074

突破边缘AI算力瓶颈:YOLOv12模型剪枝与知识蒸馏联合优化全攻略

这套剪枝-蒸馏联合方案的优势在于其系统性和可靠性。它不是单一的技巧,而是一套完整的工程流程,确保了从研发到部署的无缝衔接。

m0_71589036的博客 219

回调函数定义及用法

http://blog.youkuaiyun.com/callmeback/article/details/4242260/ 回调函数   在看LWIP时,见到用回调函数,再看某老外公司OPC源代码时,见到用回调函数。看我国内某些代码(我公司软件等)时没用到。于是,我对回调函数产生了很大的好奇。以前,我写VC程序时用到过回调函数,但是没有用C语言来使用。最近,看到国外大量的经典代码中广泛使用了回调函数(LWIP

LDF-Dicky的博客 4782

ICM20948 DMP代码详解(54)

ICM20948 DMP代码详解(54)

phmatthaus的专栏 424

lammps教程:官方自带eam_database程序拟合EAM势方法介绍

使用lammps模拟金属体系,最常用的势函数为eam、meam势。 对于大多数金属或者合金来说,可以从网上下载相对应的eam或meam势力场文件。 而对于一些新的合金材料,可能就找不到相对应的力场文件。 解决的方法有两种,一是采用混合势(pair_style hybrid),第二种方法是自己拟合势函数文件。 混合势的写法在前面文章中已经介绍过,本文介绍一种拟合EAM势的方法。 该方法是运行Xiaowang Zhou编写的一个拟合程序,该程序可自动生成所需要的合金势。 这个程序能够拟合的合金元素有: Cu,

lammps_jiayou的博客 4614

回调函数

回调函数 在看LWIP时,见到用回调函数,再看某老外公司OPC源代码时,见到用回调函数。看我国内某些代码(我公司软件等)时没用到。于是,我对回调函数产生了很大的好奇。以前,我写VC程序时用到过回调函数,但是没有用C语言来使用。最近,看到国外大量的经典代码中广泛使用了回调函数(LWIP、某两个公司的OPC程序等),都是C语言来实现的,而不是VC windows程序中别人实现自己使用的那种。

每天进步一点点... 17万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

VB传入回调函数指针至VC编写的DLL函数中,应注意的几点

http://www.china-askpro.com/msg13/qa91.shtmlhttp://support.microsoft.com/kb/q181578/VB中,应注意以下几点:声明DLL函数时,有返回值的声明为Function,无返回值声明为Sub,参数类型要一一对应,注意参数类型的字节数;注意AddressOf运算符用法;VC中,应注意以下几点:

cnrandy 的专栏 3880

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

VC回调函数定义和使用

转自:http://www.cnblogs.com/tianlangshu/archive/2011/03/20/1989439.html 最近经常使用回调函数,有时感觉有点混乱,对回调函数理解不透,昨天花点时间深深品味了一下回调函数,写下博客记录一下,言规正转,VC中的定时器是

侯文博的专栏 2691

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

VC学习之注册回调函数

VC中注册回调函数 回调函数的声明如下: extern "C" __declspec(dllexport) void _stdcall initialize(HWND gmyhWnd,const char* fileName, const char* eventFileName,const char* dbFilePath,FPConnectSCSCallbackProc connec

927
上一篇: C++虚函数与纯虚函数用法与区别
下一篇: assert()函数用法总结
sql112113
博客等级 码龄14年 2粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值