linux c回调函数

来源:互联网 发布:安东尼职业生涯数据 编辑:程序博客网 时间:2024/06/16 18:37
<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;elsereturn 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;elsereturn 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 3int 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;}


0 0
原创粉丝点击