c语言中的回调函数的设计 c语言中的回调函数的设计思路

为数组的每个元素应用回调函数?数组的4种声明方式:
1.先声明再初始化
例如:
//1.声明
int[] nums;
//初始化
nums = new int[5];
【c语言中的回调函数的设计 c语言中的回调函数的设计思路】2.声明并初始化
例如:
//2.声明、初始化
int[] nums = new int[10];
3.创建数组同时赋值
例如:
//3.创建数组同时赋值
String[] names=new String[]{"大名","小米","夏雨荷"};
int[] ages=new int[]{21,22,21,56,13};
for (int i = 0;inames.length;i){
System.out.prinrln(names[i]);
}
for (int i = 0;iages.length;i){
System.out.prinrln(ages[i]);
}
4.创建同时赋值,简写,不能写成两条语句
例如:
//4.创建同时赋值,简写,不能写成两条语句
String[] cities = {"上海","北京"};
扩展资料:
数组(Array)是有序的元素序列 。若将有限个类型相同的变量的集合命名,那么这个名称为数组名 。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量 。用于区分数组的各个元素的数字编号称为下标 。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式 。这些有序排列的同类数据元素的集合称为数组 。
数组是用于储存多个相同类型数据的集合 。
在C语言中,数组属于构造数据类型 。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型 。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别 。
c语言回调函数究竟有什么用处?我觉的用普通的函数调用替换也可以,谢谢从功能上来说 普通函数也是可以的
但在比较大的程序设计中 会对很多功能模块进行封装
比如 上层一个模块
底层一个模块
同时规定,上层可以调用底层的函数,但是底层不可以调用上层函数 。
这时就需要使用回调函数 。
通过上层调用底层的注册回调借口,传入回调指针 。
实现底层通知上层的作用 。
另外 回调函数的一个好处是,可以通过回调函数,调用不同接口 。
比如接收数据,不同数据需要不同的解析函数 。
但是接收数据的流程是相同的
这样 使用回调函数,在接收数据的时候就可以不用判断,而是自动使用不同的解析函数 。
总之 使用回调函数,可以降低耦合,实现多样性 。
callback函数怎么用?callback函数定义回调函数就是一个通过函数指针调用的函数 。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数 。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应 。
在计算机程序设计中,回调函数,或简称回调(Callback),是指通过函数参数传递到其它代码的 , 某一块可执行代码的引用 。这一设计允许了底层代码调用在高层定义的子程序:
例如:defmy_callback(input):print"functionmy_callbackwascalledwith%sinput"%(input,)defcaller(input,func):func(input)foriinrange(5):caller(i,my_callback)执行结果是:functionmy_callbackwascalledwith0inputfunctionmy_callbackwascalledwith1inputfunctionmy_callbackwascalledwith2inputfunctionmy_callbackwascalledwith3inputfunctionmy_callbackwascalledwith4input
c语言回调函数例子,看了就明白什么是回调函数了回调函数 就是上层调用 设置下去
底层通过函数指针调用上层函数
多文件中才有用 单文件可以模拟
比如
#include stdio.h
typedef void (*pFuncCb) (int);//定义回调函数 。
void callback1(int a)
{
printf("callback function1 is called and parameter = %d\n", a);//打印1
}
void callback2(int a)
{
printf("callback function2 is called and parameter = %d\n", a);//打印2
}
pFuncCb callback_function;
void lowerFunc(int n)
{
int i;
for(i = n; in 10; i)
if(callback_function) callback_function(i);
}
int main()
{
callback_function = callback1;
lowerFunc(1);// 会打印十次 打印1 , 1到10
callback_function =NULL;
lowerFunc(10);//没有打印 。
callback_function = callback2;
lowerFunc(100);// 会打印十次 打印2,100到110
return 0;
}
怎么来写一个回调函数首先你必须明白回调函数是干什么的,有什么机制,为什么要使用 , 然后怎么使用 。回调函数就是一个通过函数指针调用的函数 。如果你把函数的指针(地址)作为参数传递给另一个函数 , 当这个指针被用为调用它所指向的函数时,我们就说这是回调函数 。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应 。
回调函数实现的机制是
(1)定义一个回调函数; (2)提供函数实现的一方在初始化的时候 , 将回调函数的函数指针注册给调用者; (3)当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理 。
编辑本段为什么要使用回调函数
因为可以把调用者与被调用者分开 。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数 。如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库 , 它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者 , 想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调 。回调可用于通知机制 , 例如,有时要在程序中设置一个计时器,每到一定时间 , 程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知 。而此时,就需有一个特定原型的函数指针 , 用这个指针来进行回调,来通知我们的程序事件已经发生 。实际上 , SetTimer() API使用了一个回调函数来通知计时器,而且 , 万一没有提供回调函数,它还会把一个消息发往程序的消息队列 。另一个使用回调机制的API函数是EnumWindow() , 它枚举屏幕上所有的顶层窗口,为每个窗口调用一个程序提供的函数,并传递窗口的处理程序 。如果被调用者返回一个值,就继续进行迭代,否则,退出 。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值 , 因为基于返回值,它将继续执行或退出 。不管怎么说,回调函数是继续自C语言的,因而,在C中,应只在与C代码建立接口,或与已有的回调接口打交道时,才使用回调函数 。除了上述情况 , 在C中应使用虚拟方法或函数符(functor) , 而不是回调函数 。
编辑本段简单的回调函数实现
代码实现
下面创建了一个sort.dll的动态链接库,它导出了一个名为CompareFunction的类型--typedef int (__stdcall *CompareFunction)(const byte*, const byte*),它就是回调函数的类型 。另外,它也导出了两个方法:Bubblesort()和Quicksort(),这两个方法原型相同,但实现了不同的排序算法 。void DLLDIR __stdcall Bubblesort(byte* array,int size,int elem_size,CompareFunction cmpFunc); void DLLDIR __stdcall Quicksort(byte* array,int size,int elem_size,CompareFunction cmpFunc); 这两个函数接受以下参数: ·byte * array:指向元素数组的指针(任意类型) 。·int size:数组中元素的个数 。·int elem_size:数组中一个元素的大小,以字节为单位 。·CompareFunction cmpFunc:带有上述原型的指向回调函数的指针 。这两个函数的会对数组进行某种排序,但每次都需决定两个元素哪个排在前面 , 而函数中有一个回调函数,其地址是作为一个参数传递进来的 。对编写者来说 , 不必介意函数在何处实现,或它怎样被实现的,所需在意的只是两个用于比较的元素的地址,并返回以下的某个值(库的编写者和使用者都必须遵守这个约定): ·-1:如果第一个元素较?。?那它在已排序好的数组中,应该排在第二个元素前面 。·0:如果两个元素相等,那么它们的相对位置并不重要,在已排序好的数组中,谁在前面都无所谓 。·1:如果第一个元素较大,那在已排序好的数组中,它应该排第二个元素后面 。基于以上约定,函数Bubblesort()的实现如下,Quicksort()就稍微复杂一点: void DLLDIR __stdcall Bubblesort(byte* array,int size,int elem_size,CompareFunction cmpFunc) { for(int i=0; isize; i) { for(int j=0; jsize-1; j) { //回调比较函数 if(1 == (*cmpFunc)(array j*elem_size,array (j 1)*elem_size)) { //两个相比较的元素相交换 byte* temp = new byte[elem_size]; memcpy(temp, array j*elem_size, elem_size); memcpy(array j*elem_size,array (j 1)*elem_size,elem_size); memcpy(array (j 1)*elem_size, temp, elem_size); delete [] temp; } } } } 注意:因为实现中使用了memcpy(),所以函数在使用的数据类型方面,会有所局限 。对使用者来说,必须有一个回调函数,其地址要传递给Bubblesort()函数 。下面有二个简单的示例,一个比较两个整数,而另一个比较两个字符串: int __stdcall CompareInts(const byte* velem1, const byte* velem2) { int elem1 = *(int*)velem1; int elem2 = *(int*)velem2; if(elem1elem2) return -1; if(elem1elem2) return 1; return 0; } int __stdcall CompareStrings(const byte* velem1, const byte* velem2) { const char* elem1 = (char*)velem1; const char* elem2 = (char*)velem2; return strcmp(elem1, elem2); } 下面另有一个程序,用于测试以上所有的代码 , 它传递了一个有5个元素的数组给Bubblesort()和Quicksort(),同时还传递了一个指向回调函数的指针 。int main(int argc, char* argv[]) { int i; int array[] = {5432, 4321, 3210, 2109, 1098}; cout"Before sorting ints with Bubblesort\n"; for(i=0; i5; i) coutarray ’\n’; Bubblesort((byte*)array, 5, sizeof(array[0]), CompareInts); cout"After the sorting\n"; for(i=0; i5; i) coutarray ’\n’; const char str[5][10] = {"estella","danielle","crissy","bo","angie"}; cout"Before sorting strings with Quicksort\n"; for(i=0; i5; i) coutstr ’\n’; Quicksort((byte*)str, 5, 10, CompareStrings); cout"After the sorting\n"; for(i=0; i5; i) coutstr ’\n’; return 0; } 如果想进行降序排序(大元素在先),就只需修改回调函数的代码,或使用另一个回调函数 , 这样编程起来灵活性就比较大了 。
什么是C语言的回调函数?具体怎么用呢?回调函数,顾名思义,也就是等该函数执行完了,会回去调用我们传进去的函数 。
用到回调函数的地方有不少,像我见过的:SQLite中的一个函数,sqlite_exec函数名有没有记错我没什么印象了 。待这个函数执行完毕后,会去调用我传进去的一个函数,一般回调函数都是有自己的参数列表格式的 , 再利用这个格式从回调函数中获取到我们需要的一些值 。
关于c语言中的回调函数的设计和c语言中的回调函数的设计思路的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。

    推荐阅读