user-0 提问: 985考研题。

回复:
user: user-1
content: void 指针，变参函数，宏，Variant 类型等等都可以 宏最简单 void 指针，可变参数  需要多传入一个参数表示类型 可变参数，参数和数据类型一致，可以传入三个参数，1个表示类型，两个表示，被除数和结果 void* 需要传入地址，而非数值 另外一种是用 struct 包装 类型和数值信息。 就像 Variant 数据类型一样 任何一种都可以

user: user-2
content: 引用 4 楼 wang0635 的回复:用void指针可以吧 #include <stdio.h>  enum data_type {INT, LONG, FLOAT, DOUBLE}; void div2(void *in, void *out, enum data_type type);  int main() { 	int		i1 = 1, i2; 	long	l1 = 222222222L, l2; 	float	f1 = 1.9f, f2; 	double	d1 = 2.3, d2;  	div2(&i1, &i2, INT); 	printf("i1 = %d, i2 = %d\n", i1, i2); 	div2(&l1, &l2, LONG); 	printf("l1 = %ld, l2 = %ld\n", l1, l2); 	div2(&f1, &f2, FLOAT); 	printf("f1 = %f, f2 = %f\n", f1, f2); 	div2(&d1, &d2, DOUBLE); 	printf("d1 = %f, d2 = %f\n", d1, d2);  	return 0; }  void div2(void *in, void *out, enum data_type type) { 	switch (type) 	{ 	case INT: 		*(int *)out = *(int *)in / 2; 		break; 	case LONG: 		*(long *)out = *(long *)in / 2; 		break; 	case FLOAT: 		*(float *)out = *(float *)in / 2; 		break; 	case DOUBLE: 		*(double *)out = *(double *)in / 2; 		break; 	} }  增加一个参数，实现类型识别，这个想法可以。

user: user-3
content: 用  char*  读进来  再计算

user: user-4
content: 引用 8 楼 angel6709 的回复:这出题老师只有教学经验，没有任何工作经验，鉴定完毕 个人觉得有的时候高校考试题目有孔乙己之嫌

user: user-5
content: 引用 2 楼 ipqtjmqj 的回复:如果可以用宏函数, 则很简单 #define DIV2(data) ((data) / 2) 如果不可以: 不知道函数可以增加一个参数吗, 用'i', 'l', 'f', 'd'显式表示类型. http://codepad.org/fquSdoPH居然可以是void类型

user: user-6
content: 这出题老师只有教学经验，没有任何工作经验，鉴定完毕

user: user-7
content: 引用 6 楼 include500 的回复:[quote=引用 4 楼 wang0635 的回复:] 用void指针可以吧 #include <stdio.h>  enum data_type {INT, LONG, FLOAT, DOUBLE}; void div2(void *in, void *out, enum data_type type);  int main() { 	int		i1 = 1, i2; 	long	l1 = 222222222L, l2; 	float	f1 = 1.9f, f2; 	double	d1 = 2.3, d2;  	div2(&i1, &i2, INT); 	printf("i1 = %d, i2 = %d\n", i1, i2); 	div2(&l1, &l2, LONG); 	printf("l1 = %ld, l2 = %ld\n", l1, l2); 	div2(&f1, &f2, FLOAT); 	printf("f1 = %f, f2 = %f\n", f1, f2); 	div2(&d1, &d2, DOUBLE); 	printf("d1 = %f, d2 = %f\n", d1, d2);  	return 0; }  void div2(void *in, void *out, enum data_type type) { 	switch (type) 	{ 	case INT: 		*(int *)out = *(int *)in / 2; 		break; 	case LONG: 		*(long *)out = *(long *)in / 2; 		break; 	case FLOAT: 		*(float *)out = *(float *)in / 2; 		break; 	case DOUBLE: 		*(double *)out = *(double *)in / 2; 		break; 	} } 没看懂 enum data_type {INT, LONG, FLOAT, DOUBLE}; void div2(void *in, void *out, enum data_type type); 这是第一排枚举吧，第二排定义的函数太复杂没看懂。 对于我新手来说不知道怎么回事。[/quote] 这个函数原型见过吧 void qsort(void *base,int nelem,int width,int (*fcmp)(const void *,const void *));

user: user-0
content: 引用 4 楼 wang0635 的回复:用void指针可以吧 #include <stdio.h>  enum data_type {INT, LONG, FLOAT, DOUBLE}; void div2(void *in, void *out, enum data_type type);  int main() { 	int		i1 = 1, i2; 	long	l1 = 222222222L, l2; 	float	f1 = 1.9f, f2; 	double	d1 = 2.3, d2;  	div2(&i1, &i2, INT); 	printf("i1 = %d, i2 = %d\n", i1, i2); 	div2(&l1, &l2, LONG); 	printf("l1 = %ld, l2 = %ld\n", l1, l2); 	div2(&f1, &f2, FLOAT); 	printf("f1 = %f, f2 = %f\n", f1, f2); 	div2(&d1, &d2, DOUBLE); 	printf("d1 = %f, d2 = %f\n", d1, d2);  	return 0; }  void div2(void *in, void *out, enum data_type type) { 	switch (type) 	{ 	case INT: 		*(int *)out = *(int *)in / 2; 		break; 	case LONG: 		*(long *)out = *(long *)in / 2; 		break; 	case FLOAT: 		*(float *)out = *(float *)in / 2; 		break; 	case DOUBLE: 		*(double *)out = *(double *)in / 2; 		break; 	} } 没看懂 enum data_type {INT, LONG, FLOAT, DOUBLE}; void div2(void *in, void *out, enum data_type type); 这是第一排枚举吧，第二排定义的函数太复杂没看懂。 对于我新手来说不知道怎么回事。

user: user-0
content: 引用 3 楼 super_admi 的回复:这个题目，要看考察点在哪里，如果考察的是基本数据类型，那么你定义一个只处理双精度数据类型的函数即可，调用的时候，做强制转换；若考察的是联合体或者结构体，那么可以参考COM调用中通用类型的实现；若查考的是函数重载（早起C语言规则没有函数重载一说吧？），见楼上；若查考的是宏，见楼上。这可能是结构体，或者强制转化。因为这个书上都是有内容的，宏书上没有。能给代码吗？谢谢

user: user-7
content: 用void指针可以吧 #include <stdio.h>  enum data_type {INT, LONG, FLOAT, DOUBLE}; void div2(void *in, void *out, enum data_type type);  int main() { 	int		i1 = 1, i2; 	long	l1 = 222222222L, l2; 	float	f1 = 1.9f, f2; 	double	d1 = 2.3, d2;  	div2(&i1, &i2, INT); 	printf("i1 = %d, i2 = %d\n", i1, i2); 	div2(&l1, &l2, LONG); 	printf("l1 = %ld, l2 = %ld\n", l1, l2); 	div2(&f1, &f2, FLOAT); 	printf("f1 = %f, f2 = %f\n", f1, f2); 	div2(&d1, &d2, DOUBLE); 	printf("d1 = %f, d2 = %f\n", d1, d2);  	return 0; }  void div2(void *in, void *out, enum data_type type) { 	switch (type) 	{ 	case INT: 		*(int *)out = *(int *)in / 2; 		break; 	case LONG: 		*(long *)out = *(long *)in / 2; 		break; 	case FLOAT: 		*(float *)out = *(float *)in / 2; 		break; 	case DOUBLE: 		*(double *)out = *(double *)in / 2; 		break; 	} }

user: user-8
content: 这个题目，要看考察点在哪里，如果考察的是基本数据类型，那么你定义一个只处理双精度数据类型的函数即可，调用的时候，做强制转换；若考察的是联合体或者结构体，那么可以参考COM调用中通用类型的实现；若查考的是函数重载（早起C语言规则没有函数重载一说吧？），见楼上；若查考的是宏，见楼上。

user: user-9
content: 如果可以用宏函数, 则很简单 #define DIV2(data) ((data) / 2) 如果不可以: 不知道函数可以增加一个参数吗, 用'i', 'l', 'f', 'd'显式表示类型. http://codepad.org/fquSdoPH

user: user-10
content: 不用泛型，要一个函数，只能是函数重载的形式啦，不然你怎么将不同类型的数据传入函数，函数中又如何分辨