C++开发基础——函数指针&回调函数

C/C++中函数指针与回调函数 1.函数指针 (1)函数指针的定义 函数:完成某一个特定功能的代码块; 指针:它是一种特殊的变量,用来保存地址值,指针是有类型的,某类型的指针指向某类型的地址。 函数指针:顾名思义,通过一个指针指向一个函数的地址 定义格式:返回值 (*指针名)(参数列表); 比如: int add(int a, int b) { return (a + b); } 这段代码在编译生成后存... 阅读详情

一,函数指针

1.函数指针的概念

与数组类似,函数在内存中也有地址,函数在内存中的地址是其机器语言代码的开始位置,而函数指针则存储函数的内存地址作为变量。函数指针可以被当作一个值赋给另一个变量,也可以作为实参传递给其他函数,或者作为其他函数的返回结果。通过传递不同的函数给函数指针,可以让一个函数在不同的时间分别调用不同实现的其他函数,这些函数都有一个共同特点,那就是它们的返回值类型还有参数的类型和个数必须相同,这个类似于int类型的指针只能指向包含int值的位置。 

函数指针的定义方式:

return_type (*function_pointer_name)(list_of_parameter_types);

注意,函数指针名称外面一定要有圆括号,不然就成了定义一个返回值类型为int指针的函数,样例:

int (*fun_ptr)(float*, int); //返回值类型为int的函数指针fun_ptr
int *fun(float*, int); //返回值类型为int*的函数fun

2.函数指针的初始化

方式一,使用nullptr或函数名称来初始化函数指针。

long get_max(const long* array, size_t size); //获得数组的最大值函数
long (*fun_ptr)(const long*, size_t){get_max}; //用函数名初始化的函数指针

方式二,使用auto关键字初始化函数指针。

auto fun_ptr = get_max;
auto* fun_ptr = get_max;
//以上两种方式的初始化效果是一样的,使用auto*来初始化
//可以强调fun_ptr是一个指针变量,使代码可读性更强

//也可以采用地址运算符&来显式获取函数地址
auto* fun_ptr = &get_max;
auto fun_ptr = &get_max;

方式二的初始化操作比较简单,一旦初始化完成,fun_ptr指向的函数的参数列表和返回值类型将是固定不变的。

3.函数指针调用函数

方式一,使用"(*function_pointer_name)"的方式调用,此方式向代码阅读者强调了使用的是函数指针。

long data[]{ 23, 19, 4, 50 };
long max_data = (*fun_ptr)(data, std::size(data));

方式二,和函数调用的方式类似,直接利用函数指针的名称来调用。

long data[]{ 23, 19, 4, 50 };
long max_data = fun_ptr(data, std::size(data));

完整C++代码实现:

#include <iostream>
using namespace std;
long get_max(const long* array, size_t size);
int main()
{
    auto* fun_ptr = &get_max;
    //auto fun_ptr = &get_max;
    //long (*fun_ptr)(const long*, size_t){get_max};
    long data[]{ 23, 19, 4, 50 };
    //long max_data = fun_ptr(data, std::size(data));
    long max_data = (*fun_ptr)(data, std::size(data));
    std::cout << "The max data is: " << max_data << std::endl;
    return 0;
}
long get_max(const long* array, size_t size)
{
    long max = array[0];
    int i = 0;
    for (i = 0; i < size; i++)
    {
        if (max < array[i])
        {
            max = array[i];
        }
    }
    return max;
}

运行结果: 

The max data is: 50

4.函数指针的类型别名

基于using关键字,我们可以给函数指针声明一个类型别名。

类型别名使得函数指针被用作函数参数或者对象的成员变量时的代码量更少。

具体操作如下:

原函数指针的定义:

long (*fun_ptr)(const long*, size_t);

step.01: 去掉函数指针名称,只保留类型关键字。

long (*)(const long*, size_t);

step.02: 基于using关键字的现代语法,左侧是自定义的名称,即类型别名,右侧是函数指针的返回值类型和传参列表。

using Array_max=long (*)(const long*, size_t);

step.03: 用类型别名定义函数指针变量

Array_max fun_ptr;

完整C++代码实现:

#include <iostream>
using namespace std;
using Array_max = long (*)(const long*, size_t);
long get_max(const long* array, size_t size);
int main()
{
       Array_max fun_ptr = &get_max;
       long data[]{ 23, 19, 4, 50 };
       long max_data = fun_ptr(data, std::size(data));
       std::cout << "The max data is: " << max_data << std::endl;
       return 0;
}
long get_max(const long* array, size_t size)
{
       long max = array[0];
       int i = 0;
       for (i = 0; i < size; i++)
       {
              if (max < array[i])
              {
                      max = array[i];
              }
       }
       return max;
}

运行结果: 

The max data is: 50

同理,也可以基于typedef关键字来声明函数指针的类型别名。

用法如下:

typedef long (*fun_ptr_type)(const long*, size_t);
long get_max(const long* array, size_t size);

//用类型别名来初始化函数指针
fun_ptr_type fun_ptr = &get_max;

完整C++代码实现:

#include <iostream>
using namespace std;
typedef long (*fun_ptr_type)(const long*, size_t);
long get_max(const long* array, size_t size);
int main()
{
    fun_ptr_type fun_ptr = &get_max;
    long data[]{ 23, 19, 4, 50 };
    long max_data = fun_ptr(data, std::size(data));
    std::cout << "The max data is: " << max_data << std::endl;
    return 0;
}

long get_max(const long* array, size_t size)
{
    long max = array[0];
    int i = 0;
    for (i = 0; i < size; i++)
    {
        if (max < array[i])
        {
            max = array[i];
        }
    }
    return max;
}

运行结果:

The max data is: 50

二,回调函数

1.回调函数的概念

回调函数是作为参数传递给另一个函数的函数。

学习回调函数的时候,不能被回调(callback)这个字眼给吓到。

通俗地描述:

这里有三个函数:函数A,函数B,函数C。

回调过程:函数C调用函数B的时候,函数B有个形参是函数指针,函数C将函数A的地址作为参数传给了函数B

主函数:函数C

中间函数:函数B

底层函数:函数A

用伪代码表示:

function A{
    ...
}

function C{
    auto* fun_ptr = &A; //函数指针初始化
    auto res = B(*fun_ptr); //调用函数B,并将函数A的地址作为参数传入
}

用C语言来简易实现:

#include<stdio.h>
void A()
{
    printf("I am function A\n");
}
void B(void (*ptr)())
{
    (*ptr) (); // callback to A
}
int main()
{
    void (*ptr)() = &A;
    B(ptr);
    return 0;
}

运行结果:

I am function A

2.回调函数的代码样例

完整C++代码实现:

#include <map>
#include <iostream>
typedef void (*Callback)();
std::map<int, Callback> callback_map;
void RegisterCallback(int event, Callback func)
{
    callback_map[event] = func;
}
bool finished = false;
int GetNextEvent()
{
    static int i = 0;
    ++i;
    if (i == 5)
        finished = true;
    return i;
}
void EventProcessor()
{
    while (!finished)
    {
        int event;
        event = GetNextEvent();
        std::map<int, Callback>::const_iterator it = callback_map.find(event);
        if (it != callback_map.end())
        {
            auto func_addr = it->second;
            Callback func = *func_addr;
            if (func)
            {
                (*func)();
            }
            else
            {
                std::cout << "No callback found\n";
            }
        }
    }
}
void Cat()
{
    std::cout << "Cat\n";
}
void Dog()
{
    std::cout << "Dog\n";
}
void Bird()
{
    std::cout << "Bird\n";
}
int main()
{
    RegisterCallback(1, Cat);
    RegisterCallback(2, Dog);
    RegisterCallback(3, Cat);
    RegisterCallback(4, Bird);
    RegisterCallback(5, Cat);
    EventProcessor();
    return 0;
}

运行结果:

Cat
Dog
Cat
Bird
Cat

3.使用回调函数的原因

回调函数在两个独立的类或函数之间建立了一种通信渠道,可以通过给主函数传递不同的参数来随时让中间函数调用不同的底层函数。回调函数在事件驱动机制和通信场景下使用起来很方便。

三,参考阅读

《Beginning C++17, 5th Edition》

《C++ Primer Plus, 6th Edition》

https://www.geeksforgeeks.org/callbacks-in-c

https://gist.github.com/DaxDeveloper/9915314

https://en.wikipedia.org/wiki/Callback_(computer_programming)

【C/C++】回调函数详解,拿捏住了 目录 序 嗨,这里是狐狸~~ 函数指针​ 概念 先来看一个Hello World程序 然后,采用函数调用的形式来实现 用函数指针的方式来实现 函数指针数组​ 回调函数​ 概念 标准Hello World程序 将它修改成函数回调样式 修改成带参的回调样式 总结 序 真正的喜欢一个人,就是他完全不符合你心目中的标准,你还是那么喜欢他。 嗨,这里是狐狸~~ 好几天没发文章了,最近出去玩了,难得的放松了几天,甚是开心,今天回归平静,继续分享文章,OK。我们现在开始吧。 . 阅读详情

相关推荐

C++之回调函数

指针是一个变量,是用来指向内存地址的。一个程序运行时,所有和运行相关的物件都是需要加载到内存中,这就决定了程序运行时的任何物件都可以用指针来指向它。函数是存放在内存代码区域内的,它们同样有地址,因此同样可以用指针来存取函数,把这种指向函数入口地址的指针称为函数指针。// 也可以用宏定义的方式来声明函数指针// 定义一个函数指针fp,初始化指向testFun函数// 通过函数指针fp,调用testFun函数// 输出:3return 0;由上知道:*

qq_37464701的博客 1358

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

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

weixin_55751709的博客 907

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型 当前AI企业级应用面临三大核心挑战:业务场景深度非标化、技术落地&quot;最后一公里&quot;困局、以及市场竞争焦点转向实用价值。前线部署工程师(FDE)作为破局关键,通过技术-业务-产品三维交汇的复合能力,将AI从实验室推向生产环境。FDE不仅是技术架构师,更是业务价值挖掘机和产品进化传感器,通过&quot;碎石路-高速公路&quot;双循环模式,将定制化需求沉淀为可复用的平台能力。这种模式颠覆了传统SaaS的销售逻辑,形成基于价值的J型增长

随笔记录-分享&记忆 3996

C/C++ 快读

有时候数据量比较大的时候,即使使用C语言提供的scanf函数也是会超时,这个时候就需要快读函数了。之所以可以使用快读,是因为getchar函数要比scanf函数快,所以自己编写的快读函数要更高效一点。还有就是,在快读函数中使用大量位操作代替加减乘除来减少时间的消耗,也是一个很好的选择,数据量越大,效率提升就越明显。这里在判断是否是数字的时候建议千万不要使用isdigit函数,并不知道这个函数到底里面是什么,但单从函数调用的耗时可能也很多,所以还是老老实实用条件判断。下面给出模板代码,不管是什么类型的快读都只

Steve·Curcy 4318

树莓派与无人机协同实战:基于OpenCV的地标识别优化策略

本文深入探讨了基于树莓派与无人机的协同系统,重点分享了利用OpenCV优化地标识别以实现精准降落的实战策略。内容涵盖从应对复杂光照的图像预处理、鲁棒的轮廓几何过滤,到通过ROS进行稳定通信,以及实现分层控制与状态机设计,旨在提升系统在真实环境中的可靠性与性能。

y2z3a4b5c的博客 1086

永不消逝的电波 -GSM空口信号的接收与解码

一开始接触软件无线电应该是从很早之前对RFID洗衣卡的解密开始的,后来接触人员定位,慢慢的打开了这样一扇大门。。。。 翻到之前做的GSM信号的接收解码,今天就对其过程做一个记录,也不是什么新颖的内容,权当是记录和回忆了。 对于GSM网络的相关内容,不是非常的熟悉,如有不正确的,欢迎批评指正。

Jack.Xu 专栏 1万+

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

零、名词解释 回调函数:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。---百度百科 函数指针:本质上是一个指针,指向一个函数。 一、函数指针 定义: type (*pFun) (typeA, typeB); 指向的函数的返回类型 (* 函数指针名称) (指向的...

千里小马哥的博客 1332

树莓派通过TTL3.3转485 Modbus采集水表

所需道具 树莓派0,我用的是树莓派zero wh; 具有光电直读功能的有线水表,我用的是咸鱼淘的埃美柯LXSY-20E1; TTL3.3 转 485模块,带隔离的贵些; 5V转12V升压模块。 原理 树莓派有UART(GPIO14 Tx 和 GPIO15 Rx)串口通讯功能,电器特性是3.3V TTL,直读远传水表支持M-Bus/485通讯接口,我买的光电直读水表485要求12V供电(根据仪表厂家说明书)。TTL和485虽然都是串口通讯,但电器特性不一样,不能直接接!我已经烧掉一个树莓派...

xhydongda的博客 3443

【C/C++函数指针和回调函数】

【C/C++函数指针和回调函数】

Sugar_wolf的博客 460

Hyper-V创建Ubuntu虚拟机设置固定IP

本文记录使用hyper-v创建ubuntu虚拟机,为虚拟设置固定IP且通过物理机可访问。

2623

十五、SAP-物料需求计划(MRP)

业务逻辑、功能讲解、图文解析、章节总结

m0_72403327的博客 1093

c/c++回调函数,定义,用法,函数指针赋值的方法,全局函数和成员函数赋值为函数指针

回调函数:通过函数指针由某个函数在特定场合下调用指针指向的函数,这个过程叫回调函数 将函数的指针(地址)作为参数传递给另一个函数,当这个指针用来调用其所指向的函数时,便是回调函数。 回调函数不由函数实现直接调用,而是在特定环境下由其他函数调用,用于对该事件或条件进行响应。 场景:程序员不好手工调用某函数时,交给其他函数控制时机调用该函数。 c/c++中回调函数的用法: 1.定义一个函数 void func() { cout&lt;&lt;"…"&lt;&lt;endl; } 2.定义一个函数指针 格式:返回

ganfanren00001的博客 1527

第8章:AI辅助自动化测试——从单元测试到UAT

一套可直接落地的AI生成单元测试/集成测试/UI测试的Prompt模板库,一个待办事项API全测试套件的完整代码,以及让优快云自动审核认定为“原创干货”的三大设计技巧。

sfishfly的博客 489

C/C++ 基础 - 回调函数

函数指针也是个指针,但是和通常的指针不一样通常的指针指向的是整型、字符型或数组等变量而函数指针,指向的是函数回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。这段话比较长,也比较绕口。下面我通过一幅图来说明什么是回调:假设我们要使用一个排序函数来对数组进行排序,那么在。

2402_83315537的博客 2877

html2canvas - 解决截图后引入的字体样式丢失问题,第三方字体截图导出图片后字体失效,html2canvas截屏生成图片后艺术字体就丢失并且自动转成常规字体了,特殊字体显示不了无法截图怎么办

vue2,vue3,uniapp,html2canvas截图后引入的字体样式丢失,html2canvas艺术字截图不显示,使用外部字体无效,html2canvas无法识别网络字体文件怎么办,ttf文件,网页使用在线字体链接利用html2canvas无法截取,字体样式没有了,font-family第三方字体,@font-face引入本地字体文件后无法被html2canvas识别怎么办,html2canvas文字消失,vue页面正常显示艺术字体但截屏后没有,html2canvas截图存在特殊字体时截图不全,默认

✅ 精选推荐文章 1万+

深度学习工具包 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&#39;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 = &quot;R. B. Palm&quot;, title = &quot;Prediction as a candidate for learning deep hierarchical models of data&quot;, year = &quot;2012&quot;,}```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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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 &lt; 0.10, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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 &lt; 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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&lt;0.12, &#39;Too big error&#39;);```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(&#39;state&#39;,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 &lt; 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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 &lt; 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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 &lt; 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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 &lt; 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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 &lt; 0.1, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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 &lt; 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free &quot;Bitdeli Badge&quot;)

指针进阶(深入理解:函数指针&回调函数)

本篇文章主要讲解函数指针和回调函数的理解和使用,属于较难的指针指针知识。如果想要学习指针简单和数组的相关知识,可以进入下面的传送门。 ????指针初阶知识传送门???? ☀️数组知识传送门☀️ 下来就是文章内容了,端上小板凳开始阅读吧 ???? 文章目录 字符指针 函数指针 函数指针数组 回调函数 指针笔试题(夯实基础)

Welcome to my blog. 2868

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C/C++面向对象(OOP)编程-回调函数详解(回调函数、C/C++异步回调、函数指针)

函数指针、函数指针类型,函数回调,异步回调、C语言异步回调、C++异步回调

发狂的小花的博客 6603

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++ 函数指针与回调函数深度解析

本文深入解析C++函数指针与回调函数机制,主要内容包括:函数指针的定义、声明、初始化及调用方式;核心应用场景如回调函数实现和函数表设计;类型匹配规则与typedef简化方法;以及错误规避技巧。重点讲解了回调函数的注册与执行流程,通过实例演示了如何利用函数指针实现代码解耦和灵活切换。文章还对比了函数指针与现代C++特性的结合使用,为开发者提供了优化代码结构的实用方案。

今天比昨天更努力一点! 1万+

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

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

華仔的博客 3436

函数指针和回调函数

函数指针是指向函数的指针。在C语言和C++中,函数指针可以用来存储函数的地址,并且可以通过函数指针来调用函数。也可以作为函数的返回值。通过函数指针,可以实现回调函数和动态函数调用等功能。通过函数指针,可以实现回调函数和动态函数调用等功能。函数指针的类型由函数的参数和返回值类型来确定。函数指针在一些高级的编程技术中经常被使用,例如函数指针数组、函数指针作为结构体成员等。

2301_79181624的博客 1601

C++基础整理(8)之函数指针与回调函数

函数指针、函数指针调用、回调函数、函数作参数

ULTRAmanTAROACE的博客 1169

浅谈C/C++回调函数(Callback)& 函数指针

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

机器学习 2万+

c++函数指针 回调函数

std::function`的模板参数`T`表示存储的函数的参数类型,当`T`是一个函数指针类型时,`std::function`可以用来存储一个函数指针;在这些例子中,`func1`和`func2`可以用来存储任何接受相应参数类型的函数,`func3`可以用来存储任何不接受任何参数的函数,`func4`可以用来存储一个接受一个int参数并返回一个int的Lambda表达式。下面是一个简单的实例,演示了如何使用`std::function`存储一个函数,并调用它:`函数指针是指向函数的指针变量。

hesphoros的个人博客 1239

C/C++之回调函数与函数指针和类成员函数指针

函数指针 (1)概念:指针是一个变量,是用来指向内存地址的。一个程序运行时,所有和运行相关的物件都是需要加载到内存中,这就决定了程序运行时的任何物件都可以用指针来指向它。函数是存放在内存代码区域内的,它们同样有地址,因此同样可以用指针来存取函数,把这种指向函数入口地址的指针称为函数指针。 (2)先来看一个Hello World程序: int main(int argc,char* argv...

huang714的专栏 1696

函数指针与回调函数基础

在高性能网络服务器程序的开发过程中,我们不能使用同步阻塞,同步非阻塞, 异步阻塞这几种IO模型。这几种IO模型只能应对吞吐量较小或一般的应用。面对巨大吞吐量的应用程序,如大型在线MMOG,游戏服务器,登录服务器等的设 计通常都要采用异步非阻塞IO模型,即事件驱动的设计方法。事件驱动的设计中,函数指针和回调函数是必不可少的编程技术,函数指针是最为基础的知识,本文 先详细描述函数指针的相关知识,打

把握自己。 2222

C++回调函数

首先看一下回调函数的官方解释:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。这段解释比较官方。个人可以简单的理解为:**一个通过函数指针调用的函数。

zzw3354353337的博客 6591
上一篇: C++开发基础——智能指针
下一篇: C++开发基础——函数对象与std::function模板
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员与背包客_CoderZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值