源代码:(文件已合并,2代码+1Makefile)
1 // Linux C程序设计大全
2
3 /*
4 * FILE: p110_call_main.c
5 * DATE: 20180108
6 * --------------
7 * DESCRIPTION: 分别比较出struct和int指针数组最大值
8 * void通用指针,函数指针
9 */
10
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14
15 #define NUMBER 4
16
17 struct book{
18 int id;
19 char name[10];
20 };
21
22 extern void *max(void *array[], int len, int (*func)(void *, void *));
23 extern int cmp_int(void *p, void *q);
24 extern int cmp_struct(void *p, void *q);
25
26 int insert_struct(struct book **p, int id, char *name);
27 int insert_int(int **p, int val);
28
29 int main(int argc, char *argv[])
30 {
31 // 指针数组
32 struct book *array_book[NUMBER], *res_book;
33 int *array_int[NUMBER], *res_int;
34 int i;
35 for(i=0; i<NUMBER; i++)
36 {
37 int id;
38 char name[10];
39 int val;
40
41 printf("input info of book: \n");
42 scanf("%d", &id);
43 scanf("%s", name);
44 insert_struct(array_book+i, id, name);
45
46 printf("input int: \n");
47 scanf("%d", &val);
48 insert_int(array_int+i, val);
49 }
50 for(i=0; i<NUMBER; i++)
51 {
52 printf("=== id %d, name %s\n", (array_book[i])->id, (array_book[i]->name));
53 printf("=== int %d\n", *array_int[i]);
54 }
55 res_book = (struct book *)max((void *)array_book, NUMBER, cmp_struct);
56 res_int = (int *)max((void *)array_int, NUMBER, cmp_int);
57
58 printf("the max of books: %d, %s\n", res_book->id, res_book->name);
59 printf("the max of int: %d\n", *res_int);
60 return 0;
61 }
62
63 int insert_struct(struct book **p, int id, char *name)
64 {
65 *p = (struct book *)malloc(sizeof(struct book));
66 if(*p == NULL)
67 {
68 perror("ERROR: malloc, fail to apply memory");
69 return -1;
70 }
71 (*p)->id = id;
72 strcpy((*p)->name, name);
73 return 0;
74 }
75
76 int insert_int(int **p, int value)
77 {
78 *p = (int *)malloc(sizeof(int));
79 **p = value;
80 return 0;
81 }
82
83
84
85 /*
86 * FILE: p110_call_cmp.c
87 * DATE: 20180108
88 * --------------
89 * DESCRITPION: void指针
90 */
91
92 struct book{
93 int id;
94 char name[10];
95 };
96
97 int cmp_int(void *p, void *q);
98 int cmp_struct(void *p, void *q);
99
100 /* 根据传入的函数指针,调用相应的函数 */
101 void *max(void *array[], int len, int (*func)(void *, void *))
102 {
103 int i;
104 void *tmp = array[0];
105 for(i=1; i<len; i++)
106 {
107 if((*func)(tmp, array[i]) < 0)
108 tmp = array[i];
109 }
110 return tmp;
111 }
112
113 /* 大于则返回1,小于则返回-1,等于则返回0 */
114 int cmp_struct(void *p, void *q)
115 {
116 // 将void指针强制类型转换,否则编译警告warning
117 struct book *a = (struct book *)p;
118 struct book *b = (struct book *)q;
119 if(a->id > b->id)
120 return 1;
121 else if(a->id < b->id)
122 return -1;
123 else
124 return 0;
125 }
126
127 int cmp_int(void *p, void *q)
128 {
129 int *a = (int *)p;
130 int *b = (int *)q;
131 if(*a > *b)
132 return 1;
133 else if(*a < *b)
134 return -1;
135 else
136 return 0;
137 }
138
139
140
141 # FILE: Makefile
142 # DATE: 20180108
143 # ==============
144
145 OBJECTS = p110_call_main.o p110_call_cmp.o
146
147 build: $(OBJECTS)
148 gcc -o build $(OBJECTS)
149
150 p110_call_main.o: p110_call_main.c
151 gcc -c p110_call_main.c
152
153 p110_call_cmp.o: p110_call_cmp.c
154 gcc -c p110_call_cmp.c
155
156 .PHONY: clean
157 clean:
158 rm build $(OBJECTS)
159
编译运行: