我被要求编写一个代码,该代码接收一种数据类型,而没有具体说明什么类型(例如,int,float,double ect ..)及其确定的数字。 代码很简单,在数组中找到一个数字并返回它在数组中的位置。 这是我写的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int findselectnum(int num, int array[], int size)
{
int i = 0;
for (i = 0; i <= size; i++)
{
if (num == array[i])
return i;
}
return EOF;
}
int main()
{
int array[] = { 1, 3, 5, 10, 88, 21, 100, 77, 0, 11, 2 }, num = 0, result = 0, size = 0;
printf("Enter a number you wish to find\n");
scanf("%d", &num);
size = sizeof(array);
result = findselectnum(num, array, size);
if (result != EOF)
printf("The number %d is in array[%d]\n", num, result);
else
printf("The number does not exists on the array");
}
如您所见,我只能使用int类型,因此浮点或双精度的数字将不会得到相同的结果。 那么我该如何使用所有类型的数据呢?是否有某种结构? 预先感谢。
答案 0 :(得分:0)
您可以使用void *类型代替int []类型。
它是memcpy()函数使用的类型,因此它可以复制任何类型的数据。
然后,您必须强制转换void *参数,以将其与所需类型的变量进行比较。
我个人不会使用C来执行此类任务。
C ++可能更合适,因为它本机处理此类机制(模板): https://en.wikipedia.org/wiki/Template_(C%2B%2B)
答案 1 :(得分:0)
我被要求编写一个接收数据类型的代码,而没有具体说明什么类型(例如,int,float,double ect ..)及其确定的数字。
那么我该如何使用所有类型的数据?
不能。更具体地说,CPU本身不能。要比较2个数字,CPU必须知道数字的大小,数字是整数还是浮点型,以及数字是否带符号(如果不只是为了进行相等比较)。
有3种解决方法:
a)代码重复(包括C ++中的模板,在该模板中,编译器会自动为N个类型生成N个版本的代码,并使用C中的宏进行类似操作)。
b)仅支持最大类型(例如,在C语言中为double
),并将所有内容转换为最大类型,因此您只需要为一个类型使用一个函数。
c)滥用变量参数,并基于“它是什么类型”参数具有运行时分支(并增加了程序员错误的风险);像int findselectnum(char *data_type, int size, ...)
。多数情况下这最终是伪装的代码重复(例如,您在case
的每个switch(data_type)
中复制了循环)。
根据实际情况;我会混合使用前两个选项-例如找出为什么软件设计得如此差,以至于它需要在多种不同类型上进行相同的工作,然后尝试更改设计,以便只需要关心少量不同类型。然后针对“不可避免的”类型具有少量不同的功能(例如,可能是int findselectnum_int(int num, int array[], int size)
和单独的int findselectnum_double(double num, double array[], int size)
; float
或short
则没有任何功能,或者因为它们是可以避免的。