有没有办法接收各种数据类型?

时间:2019-01-17 10:25:19

标签: c

我被要求编写一个代码,该代码接收一种数据类型,而没有具体说明什么类型(例如,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类型,因此浮点或双精度的数字将不会得到相同的结果。 那么我该如何使用所有类型的数据呢?是否有某种结构? 预先感谢。

2 个答案:

答案 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)floatshort则没有任何功能,或者因为它们是可以避免的。