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; }
相关文章推荐
- Linux RHCS 基础维护命令
- 基础教程:Linux 新手应该知道的 26 个命令
- RedHat 6.2 Linux修改yum源免费使用CentOS源
- CentOS yum源 部署
- CentOS下常用的 19 条命令
- linux系统查看外网IP
- Cobbler自动批量部署CentOS 6和CentOS 7
- 于linux已安装moodle
- 基于linux的bond技术
- 总结之:CentOS6.5下openssl加密解密及CA自签颁发证书详解
- Linux系统:开放源代码应用程序的编译与安装
- Ubuntu linux 环境基本使用
- linux信号掩码
- Linux中history输出格式的定制
- Linux系统中一些实用的快捷键
- 超实用的Linux/Unix快捷键大汇总
- linux(centos)搭建SVN服务器
- Linux开启ssh服务
- linux系统下怎么安装.deb文件
- linux下echo命令详解