结构体中得函数指针,让我们更加方便~

结构体指针详解 1、用结构体变量来为结构体指针初始化 struct student //定义了一个结构体 { long stuid; char name[10]; int age; int score; }stu1; //定义了一个结构体变量 struct student stu2; //因为结构体含有名字,所以可以继续定义结构体变量stu2 struct student *stu3; //定义了一个结构体指针 stu3=&stu1; //同指针一样,结构体. 阅读详情

转自:http://blog.youkuaiyun.com/unix21/article/details/9293877

结构体指针变量的定义,定义结构体变量的一般形式如下:

形式1:先定义结构体类型,再定义变量
struct结构体标识符
{
成员变量列表;…
};
struct 结构体标识符 *指针变量名;

变量初始化一:struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n };


形式2:在定义类型的同时定义变量
struct结构体标识符
{
成员变量列表;…
} *指针变量名;

变量初始化二:


形式3:直接定义变量,用无名结构体直接定义变量只能一次
struct
 {
成员变量列表;…
}*指针变量名;


其中“指针变量名”为结构体指针变量的名称。形式1是先定义结构体,然后再定义此类型的结构体指针变量;形式2和形式3是在定义结构体的同时定义此类型的结构体指针变量。


函数指针的定义

  一般的函数指针可以这么定义:

  int(*func)(int,int);

  表示一个指向含有两个int参数并且返回值是int形式的任何一个函数指针. 假如存在这样的一个函数:

  int add2(int x,int y)

  {

  return x+y;

  }

  那么在实际使用指针func时可以这样实现:

  func=&add2; //指针赋值,或者func=add2; add2与&add2意义相同

  printf("func(3,4)=%d\n",func(3,4));

  事实上,为了代码的移植考虑,一般使用typedef定义函数指针类型.

  typedef int(*FUN)(int,int);

  FUN func=&add2;

  func();



结构体中包含函数指针

其实在结构体中,也可以像一般变量一样,包含函数指针变量.下面是一种简单的实现.

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. struct DEMO  
  3. {  
  4. int x,y;  
  5. int (*func)(int,int); //函数指针  
  6. };  
  7.   
  8. int add1(int x,int y)  
  9. {  
  10. return x*y;  
  11. }  
  12.   
  13. int add2(int x,int y)  
  14. {  
  15. return x+y;  
  16. }  
  17.   
  18. void main()  
  19. {  
  20. struct DEMO demo;  
  21. demo.func=add2; //结构体函数指针赋值  
  22. //demo.func=&add2; //结构体函数指针赋值  
  23. printf("func(3,4)=%d\n",demo.func(3,4));  
  24. demo.func=add1;  
  25. printf("func(3,4)=%d\n",demo.func(3,4));  
  26. }  
  27.   
  28. /* 
  29. 输出: 
  30. func(3,4)=7 
  31. func(3,4)=12 
  32. */  


结构体中指向函数的指针                                          

C语言中的struct是最接近类的概念,但是在C语言的struct中只有成员,不能有函数,但是可以有指向函数的指针,这也就方便了我们使用函数了。举个例子,如下:

[cpp]  view plain copy
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.   
  5. typedef struct student  
  6. {  
  7.     int id;  
  8.     char name[50];   
  9.     void (*initial)();  
  10.     void (*process)(int id, char *name);  
  11.     void (*destroy)();  
  12. }stu;  
  13.   
  14. void initial()  
  15. {  
  16.     printf("initialization...\n");  
  17. }  
  18.   
  19. void process(int id, char *name)  
  20. {  
  21.     printf("process...\n%d\t%s\n",id, name);  
  22. }  
  23.   
  24. void destroy()  
  25. {  
  26.     printf("destroy...\n");  
  27. }  
  28.   
  29. int main()  
  30. {  
  31.     stu *stu1;  
  32.     //在VC和TC下都需要malloc也可以正常运行,但是linux gcc下就会出错,为段错误,必须malloc  
  33.     stu1=(stu *)malloc(sizeof(stu));  
  34.     //使用的时候必须要先初始化  
  35.     stu1->id=1000;  
  36.     strcpy(stu1->name,"C++");  
  37.     stu1->initial=initial;  
  38.     stu1->process=process;  
  39.     stu1->destroy=destroy;  
  40.     printf("%d\t%s\n",stu1->id,stu1->name);  
  41.     stu1->initial();  
  42.     stu1->process(stu1->id, stu1->name);  
  43.     stu1->destroy();  
  44.     free(stu1);  
  45.     return 0;  
  46. }  

输出:

/*
1000    C++
initialization...
process...
1000    C++
destroy...
*/

c语言中,如何在结构体中实现函数的功能?把结构体做成和类相似,让他的内部有属性,也有方法
这样的结构体一般称为协议类,提供参考: 
struct { 
 int funcid; 
 char *funcname; 
 int (*funcint)(); /* 函数指针 int 类型*/ 
 void (*funcvoid)(); /* 函数指针 void类型*/ 
}; 
每次都需要初始化,比较麻烦

 

[cpp]  view plain copy
  1. #include <stdio.h>  
  2.   
  3. typedef struct  
  4. {  
  5. int a;  
  6. void (*pshow)(int);  
  7. }TMP;  
  8.   
  9. void func(TMP *tmp)  
  10. {  
  11.     if(tmp->a >10)//如果a>10,则执行回调函数。  
  12.     {  
  13.         (tmp->pshow)(tmp->a);  
  14.     }  
  15. }  
  16.   
  17. void show(int a)  
  18. {  
  19.     printf("a的值是%d\n",a);  
  20. }  
  21.   
  22. void main()  
  23. {  
  24.     TMP test;  
  25.     test.a = 11;  
  26.     test.pshow = show;  
  27.     func(&test);  
  28. }  
  29.   
  30. /* 
  31. 一般回调函数的用法为: 
  32. 甲方进行结构体的定义(成员中包括回调函数的指针) 
  33.  
  34. 乙方定义结构体变量,并向甲方注册, 
  35. 甲方收集N个乙方的注册形成结构体链表,在某个特定时刻遍历链表,进行回调。 
  36. 当 函数指针 做为函数的参数,传递给一个被调用函数, 
  37. 被调用函数就可以通过这个指针调用外部的函数,这就形成了回调<p>一般的程序中回调函数作用不是非常明显,可以不使用这种形式</p><p>最主要的用途就是当函数不处在同一个文件当中,比如动态库,要调用其他程序中的函数就只有采用回调的形式 
  38. 通过函数指针参数将外部函数地址传入来实现调用</p><p>函数的代码作了修改,也不必改动库的代码,就可以正常实现调用便于程序的维护和升级</p>*/  
结构体自定义指针函数c语言,详解C语言结构体中的函数指针 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。所以,标准C中的结构体是不允许包含成员函数的,当然C++中的结构体对此进行了扩展。那么,我们在C语言的结构体中,只能通过定义函数指针的方式,用函数指针指向相应函数,以此达到调用函数的目的。函数指针函数类型 (*指针变量名)(形参列表);第一个括号一定不能少。“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的... 阅读详情

相关推荐

定义结构体类型时用结构体自身类型或指针定义内部成员

定义自身类型的成员是不可以的 定义结构体时,是不可以定义自身类型的成员的。这是因为结构体中各个成员所需的存储空间大小是编译阶段确定的,当用该结构体定义自身成员时,由于结构体大小还不确定,因此此时定义的陈冠所需要的存储空间大小也就不确定,因此编译会报错; 定义自身类型的指针成员时可以的 但是可以定义该结构体类型的指针,因为指针在固定的平台上所占的内存大小是确定的! 比如: typedef struc...

mengshushu90的博客 6002

结构体中定义指针

转自:http://blog.youkuaiyun.com/unix21/article/details/9293877 结构体指针变量的定义,定义结构体变量的一般形式如下: 形式1:先定义结构体类型,再定义变量 struct结构体标识符 { 成员变量列表;… }; struct 结构体标识符 *指针变量名; 变量初始化一:struct结构体标识符 变量名={初始化值1,初

心随梦动 6521

Zorb嵌入式状态机框架:轻量级C语言层级化FSM实现

状态机(FSM)是嵌入式系统中组织事件驱动逻辑的基础范式,其核心在于状态定义、转移控制与生命周期管理。基于有限状态机原理,通过函数指针封装与结构体组合,可实现无RTOS依赖、零动态内存分配的确定性行为建模。该技术显著提升代码可维护性与模块可测试性,广泛应用于设备协议栈、人机交互、自检流程等资源受限场景。Zorb Framework 以纯C语言提供面向对象风格的层级化FSM支持,具备嵌套调度、条件激活、原子转移等关键能力,适用于STM32、GD32等主流MCU平台。

weixin_42502089的博客 108

为什么结构体里面可以定义结构体指针(链表)

对那个结构体指针来看,就是创建这样一个结构体就要创建一个指向这种结构体的指针。声明更像是在说,如果要创建结构体,就要创建那么多变量,例如上面的创建的struct S,就是在说,如果要创建struct S类型的变量,那么就要创建两个整形,一个struct S类型的指针,一个struct L类型的指针,如果没有这个结构体,我们一样 可以创建这样两个指针。整个结构体里面的成员和结构体并不冲突,是成员一起构成了结构体,只不过里面多了一个结构体指针类型的成员,他并不指向此结构体,因为只是声明了此结构体,并不占内存。

Hungry_11的博客 1555

干货|手把手教你写单片机的结构体

摘要:听说还有好多学单片机的小伙伴不会用结构体?指针和结构体是学单片机必须要掌握的,如果你C语言掌握的不牢,单片机根本学不到精髓,只能完非常低级的项目。看得懂结构体并且能够灵活运用结构体才能说你入门了单片机。本篇将以最通俗的方式结合STM32单片来将将结构体的运用。解决你学完C语言、考过了计算机二级还是看不懂单片机结构体的苦恼。宝藏文章,记得点赞转发收藏。 大家知道指针和结构体是单片机的难点,所以就去学习C语言,找视频看书… 这里面每一个视频的播放量都非常高。对于单纯的学习C语言,这里讲的很清楚。看完你不

果果小师弟的博客 1万+

C++学习心得第一期 函数指针结构体

C++学习心得第一期 函数指针结构体一、函数1.函数多文件编写2.函数值传递二、指针1.指针变量的定义和使用2.指针所占内存空间3.空指针和野指针4.const修饰指针5.指针和数组5.指针和函数6.指针 数组 函数三、结构体1.结构体中const的使用2.实例13.实例2 一、函数 1.函数多文件编写 让代码结构更加清晰 函数分文件编写一般有4个步骤 创建后缀名为.h的头文件 创建后缀名为.cpp的源文件 在头文件中写函数的声明 +所使用的头文件和命名空间 在cpp源文件中写函数的定义 需要加 i

qq_37448336的博客 1174

C语言:指针、结构体、函数指针、链表

结构体定义,是保存在flash的吧?**答:**对于这个问题,大家可以反过来想一想。Flash里面会保存chat这个类型吗?会保存int这个类型吗?会保存各种结构体的类型吗?这些数据类型只是给C语言用而已,C语言最终要转换成汇编。在汇编里面,根本就没有这些数据类型。

jay__2020的博客 2050

C语言结构体对齐与函数指针:内存优化与回调机制详解

内存对齐是计算机系统中提升数据访问效率的基础技术,其原理在于CPU按特定字节边界读取内存,未对齐的数据会导致多次内存访问从而影响性能。在C语言编程中,结构体对齐通过编译器自动插入填充字节来优化内存布局,这对系统编程和嵌入式开发尤为重要。函数指针作为C语言的核心特性,实现了回调机制和多态行为,是构建灵活软件架构的关键技术。通过结构体对齐优化内存使用效率,结合函数指针实现高级编程模式,开发者能够编写出性能更高、可维护性更强的代码。本文深入解析结构体对齐原则和函数指针应用,帮助读者掌握这些底层机制在内存管理和回调

weixin_33946605的博客 469

C语言结构体中定义函数指针详解

C语言结构体中定义函数指针详解

qq_44884619的博客 7178

vue3的面试题

vue3的面试题

jiang7701037的博客 6263

DIY等离子环:从Class-E电路到七彩辉光,手把手教你打造炫酷科学玩具

本文手把手教你DIY一个炫酷的等离子环科学玩具。从解析等离子体辉光放电原理入手,详细介绍了核心的Class-E自激振荡电路设计、关键元件选型与参数计算,并提供了从物料准备、电路搭建、腔体密封到上电调试的全流程指南。通过调制电路或填充不同气体,还能实现七彩变换与交互效果,是学习高频电路与电磁场知识的绝佳实践项目。

weixin_29305337的博客 633

结构体中的函数指针

在结构体中定义函数指针,然后对其调用(和类调用的方法是一样的~)在调用时对其赋值。 #include struct square {     int weight;     int width;     int height;     int (*add )(int a,int b); }; int square_add(int a,int b) {     return a

C-now-s的专栏 812

别再写爬虫了!用Trae平台5分钟搞定一个能聊天的网页数据抓取Agent

本文介绍了如何利用Trae平台快速构建无需编程的网页数据抓取智能体,实现对话式数据采集。通过自然语言指令,用户可在5分钟内完成从数据抓取到分析的全流程,显著降低技术门槛和维护成本。文章详细解析了Trae智能体的核心能力,包括自然语言理解、智能页面解析、数据清洗和可视化配置,并提供了多个实战案例,展示其在竞品监控和舆情分析中的高效应用。

weixin_29038303的博客 717

成员变量为函数指针的结构体的理解

  看到一段代码 typedef struct{ int (* initialize)(void); }FSMC_T; FSMC_T fsmc = { .initialize = initialize }; static int initialize(void) { GPIOD->CRH.W = 0xbbbbbbbb; ...

aifuxun2845的博客 250

Allegro 16.6 高级技巧实战:用Region规则和动态间距搞定高密度连接器布局布线

本文深入探讨了Allegro 16.6在高密度连接器布局布线中的高级技巧,重点介绍了Region规则和动态间距属性的应用。通过局部规则覆盖和分层控制,解决0.5mm以下引脚间距的布线难题,提升PCB设计效率和质量。

weixin_30352645的博客 438

【Bug已解决】Codex Desktop 更新后无法启动/闪退解决方案

方案适用场景推荐指数清理本地缓存重启最常见、最应优先尝试的方案⭐⭐⭐⭐⭐完全卸载重装缓存清理无效时的进阶方案⭐⭐⭐⭐详细日志定位崩溃环节需要精确诊断问题原因⭐⭐⭐⭐锁定旧稳定版本确认是特定版本缺陷时的过渡方案⭐⭐⭐反馈官方支持团队自助方式无效时的最终途径⭐⭐⭐⭐Codex Desktop 更新后无法启动/闪退的本质通常是新版本程序在启动时读取到了旧版本遗留的、格式不兼容的本地缓存或配置数据,导致启动流程中途崩溃。

一键难忘的博客 6282

结构体中的函数指针(c语言里一种思想)

结构体与函数 函数指针

克克克克业业的学习记录 505

5 分钟上手 Kimi Work:安装、配置、跑通第一个任务

这篇文章提供了Kimi Work的快速入门指南,帮助用户在5分钟内完成从安装到运行第一个任务的全过程。主要内容包括: 安装步骤: macOS用户下载.dmg文件并拖入Applications Windows用户下载.exe安装包,需注意中文路径问题 初始设置: 使用现有Kimi账号登录 检查任务配额和文件访问权限 首个任务推荐: 建议从简单的本地文件整理开始(如按类型分类桌面文件) 详细说明了任务执行流程和审批机制 常见问题: 计划生成卡顿的解决方法 文件无变化的排查步骤 进阶建议: 提供难度递增的后续任务

sg_knight的专栏 2765

c语言的指针函数、函数指针、函数指针数组

1、区别: 指针函数:返回值为指针的函数指针函数:返回值为指针的函数 函数指针:只想函数的指针 函数指针数组:存放函数指针的数组 2、是什么样子 指针函数: 数据类型 * 函数名 (参数); 例: 返回值为int型指针的函数,函数名是fun,参数是x,y; int *fun(int x, int y); 函数指针: 数据类型 (*函数名)(参数); 例: int (*p)(int,i...

lqf_ok的博客 1133

华为OD机试双机位C卷-FLASH坏块监测系统(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【FLASH坏块监测系统】,提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - FLASH坏块监测系统。

qq_45776114的博客 1928

CAPL编程规范与最佳实践

通过本文的学习,读者应该对CAPL编程规范与最佳实践有了初步的了解,并能够编写高质量的CAPL脚本。在实际项目中,CAPL的应用非常广泛,希望读者能够通过不断的学习和实践,掌握更多的CAPL技巧,提高自己的开发能力。

闲人编程的博客 1747

C++ 函数指针的声明与使用

C++函数指针 一 函数指针是什么 1.函数指针是指针 函数指针也是指针的一种,是指针的子集,所以它应该有指针的一些特性; 函数指针也附带了函数的一些特性。 2.函数指针该如何声明? 我们可以和int类型的指针的声明进行比对一下: 声明一个int型指针: int *p ; 声明一个函数型(假如是一个有两个int类型的参数以及一个 int类型的返回值)的指针: int (*pFunc)(int, int); 我们把指针名称提出来看一下, 整形指针 函数指针 int * int (*)(

逢歌的博客 7621

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【6U字符设备驱动开发学习2】

本文摘要:文章介绍了Linux字符设备的注册与注销方法,重点讲解了register_chrdev()和unregister_chrdev()函数的使用及参数说明。详细解析了设备号(dev_t)的构成原理及相关的宏操作函数,包括主/次设备号的获取和组合。文章还列出了file_operations结构体的关键成员,并补充了函数指针与指针函数的区别说明,通过代码示例展示了它们的实际应用场景。最后提供了查看系统设备号的命令方法。

qq_51384120的博客 545

深度学习工具包 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")

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

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

C | 函数指针数组妙用

铁汁们都知道,指针对C/C++来说就是灵魂,而同类型指针又能封装到数组中。本文就来讲讲函数指针数组的应用场景优化之后代码整洁直观了许多,主要思想就是统一打包。相信函数指针数组还有很多应用场景,快去试试叭~

CGod的博客 1161

函数指针的应用——抽象对象

我的封装是较为适用与我目前开发的平台,对象只有硬件设备层和应用层,只有两层,其实可以继续抽象出系统调用层,使硬件设备层和应用层中加入一个系统调用层。可以使得程序的维护性更高,成为模块化。

xc_mt的博客 522
上一篇: C语言初步总结
下一篇: Quick Sort快速排序,顶。
SKyu4
博客等级 码龄12年 11粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值