我正在尝试用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;
}
答案 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;
}
,即
&
答案 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);