接受C中任何数字类型的函数

时间:2018-02-06 17:32:19

标签: c void-pointers

我正在尝试用C语言构建一个程序,它可能会接收任何类型的数字数组和一个要在数组中搜索的数字,并将返回它的位置。 目前我得到了"错误:无效使用void表达式"对于func函数中的第3行。 我试图解决这个问题的方式是否相关?如果不是什么应该是解决方案,因为我想尽可能通用?

代码如下:

void func(int,void*,double,int);
int main(){
        /* arrays and numbers to search in each array*/
        int arrInt[]={3,4,5,15,6,24,7,13,12};
        double arrD[]={1.1,1.4,1.5,2.2,7.6,10.2};
        long arrL[]={10,20,30,40,50,60};
        int i2s=7;
        double d2s=7.6;
        long l2s=40;

        func(sizeof(int*),arrInt,i2s,9);
        func(sizeof(double*),arrD,d2s,6);
        func(sizeof(long*),arrL,l2s,6);

}

void func(int size,void *arr,double num,int arrSize){
        int i;
        for(i=0;i<arrSize;i++){
                if((double*)*arr==num)
                        return i+1;
                arr=arr+size;
        }
        return -1;
}

2 个答案:

答案 0 :(得分:1)

在以下条件中取消引用<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div id="thing"></div> <button id="button">Click to change colour</button>会触发错误:

void*

另外,在 if((double*)*arr==num) 上进行指针运算不是标准的。

即使您在指针转换后修复了的解除引用语法,除非您实际传递void*的数组,否则比较将失败,因此您需要更改方法。

您可以通过将指针传递给搜索项并使用double进行比较来解决问题:

memcmp

请注意,现在您需要在呼叫中使用地址运算符int func(size_t size, void *arr, void* pnum, size_t arrSize) { for (int i=0 ; i != arrSize ; i++, arr = ((char*)arr)+size ) { if(memcmp(arr, pnum, size)==0) return i+1; } return -1; } ,即

&

Demo.

答案 1 :(得分:0)

你得到的错误在这里:

(double*)*arr

您试图取消引用不允许的void *。您希望将该指针强制转换为特定类型,然后然后取消引用:

*(double *)arr

然而,这仍然不会做你想要的。对于double以外的类型,您将尝试读取多个字节,就好像它们是double一样。不同的类型具有不同的表示形式,因此您不能使用包含int的地址,告诉编译器将其读作double,并期望得到任何有意义的内容。

为此,您需要将实际类型传递给函数(或指定类型的值)。类型不能在C中传递,因此您需要一个标志:

enum searchTypes {
    INT,
    LONG,
    DOUBLE
};

void func(int type, void *arr, double num, int arrSize){
        int i;
        for(i=0; i<arrSize; i++){
                double val = 0;
                switch (type) {
                case INT: 
                    val = ((int *)arr)[i];
                    break;
                case LONG: 
                    val = ((long *)arr)[i];
                    break;
                case DOUBLE: 
                    val = ((double *)arr)[i];
                    break;
                }
                if (val==num) {
                        return i+1;
                }
        }
        return -1;
}

然后这样称呼:

func(INT,arrInt,i2s,9);
func(DOUBLE,arrD,d2s,6);
func(LONG,arrL,l2s,6);