您的位置:首页 > 运维架构 > Linux

linux c回调函数

2015-09-16 14:46 399 查看
<strong>common.h</strong>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* 定义一个自定义类型的函数指针,返回值是整型,两个参数是两个任意类型的指针
* 该函数的两个参数分别是需要比较的两个对象,在比较时将其转换
* 如果大于则返回1,等于则返回0,小于则返回-1
*/
typedef int (*cmp)(void *, void *);

typedef struct book* Book;

/* 图书结构
* id : 图书的编号
* name : 图书的名字
*/
struct book{
int id;
char name[10];
};

/* 求最大对象的函数 */
extern void *max(void *array[], int len, cmp func);

/* 比较两个整数的函数 */
extern int cmp_int(void *p, void *q);
/* 比较两个图书结构的函数 */
extern int cmp_struct(void *p, void *q);

/* 插入一个结构 */
extern int insert_struct(Book *pos, int id, char * name);
/* 插入一个整数 */
extern int insert_int(int **pos, int val);

cmp.c

#include "common.h"

int cmp_int(void *p, void *q)
{
int *a, *b;
a = (int *)p; /* 将参数中void *类型的指针转换为int型的指针 */
b = (int *)q;

if(*a > *b) /* 比较两个值的大小 */
return 1;
else if(*a < *b)
return -1;
else
return 0;
}

int cmp_struct(void *p, void *q)
{
Book a, b;

a = (Book)p; /* 将参数中void *类型的指针转换为Book类型的指针 */
b = (Book)q;

if(a->id > b->id) /* 比较成员变量id的大小 */
return 1;
else if(a->id < b->id)
return -1;
else
return 0;
}


obj.c

#include "common.h"
/* 创建一个图书结构,并将其插入到指定的位置
* pos : 保存新创建的结构体的数组的指针,注意这是一个指向Book指针类型的指针
* id : 新结构体的id
* name : 新结构体的name
* 如果成功创建一个新结构并将其设置到指定位置,则返回0,失败则返回-1
*/
int insert_struct(Book *pos, int id, char *name)
{
Book p;

p = (Book)malloc(sizeof(struct book)); /* 分配一个空间 */
if(p == NULL){
perror("fail to malloc");
return -1;
}

p->id = id;
strcpy(p->name, name); /* 对结构体变量进行赋值 */

*pos = p; /* 将结构体变量赋值到数组中 */

return 0;
}

/* 为了统一模式,添加一个插入整型元素的函数,这个函数也可以不要 */
int insert_int(int **pos, int val)
{
int *p;

p = (int *)malloc(sizeof(int)); /* 分配一个整型数据 */

*p = val; /* 将整型数据的值赋值到新分配的空间中 */
*pos = p; /* 将整型数据设置到数组中 */

return 0;
}
max.c

#include "common.h"
/* 求序列中最大对象的函数,并且返回最大对象的位置
* array : 存储对象的数组,每个元素是一个指向对象的指针
* len : 存储对象的数组的元素个数
* func : 用于比较两个对象的回调函数
*/
void *max(void *array[], int len, cmp func)
{
int i;
void *tmp;

tmp = array[0]; /* 初始时最大对象是数组中的第一个对象 */
for(i = 1; i < len; i++) { /* 遍历数组,比较每个对象 */

/* 比较两个对象,调用用户提供的比较函数。
* 如果当前对象大于之前的最大对象,则替换掉最大对象
*/
if((*func)(tmp, array [i]) == -1)
tmp = array [i];
}

return tmp; /* 返回最大对象 */
}
main.c
#include "common.h"

#define MAX 3

int main(void)
{
Book array1[MAX];	/* 结构体变量的数组 */
int *array[MAX];	/* 整型变量的数组 */
int i;
int id;
int val;
char name[10];
Book res1;
int *res2;

for(i = 0; i < MAX; i++)
{ /* 每次输入一个结构的信息和一个整数 */
printf("input info of book\n");
scanf("%d", &id);
scanf("%s", name);
if(insert_struct(array1 + i, id, name) == -1)
/* 将新结构插入到数组中 */
exit(1);

printf("input int\n");
scanf("%d", &val);
/* 将新的整型元素插入到数组中 */
if(insert_int(array + i, val) == -1)
exit(1);
}
res1 = (Book)max((void **)array1, MAX, cmp_struct);	/* 得到id最大的图书结构 */
res2 = (int *)max((void **)array, MAX, cmp_int);	/* 得到最大的整型元素 */

printf("the max of books : %d, %s\n", res1->id, res1->name);
/* 输出结果 */
printf("the max of int : %d\n", *res2);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: