所以我试图根据我的排序功能在这样的函数中获取值。
void * getBest(void *t, unsigned int n, unsigned int bytes, int (*vrt)(void *, void *)) {
int i = 0;
int returnI = 0;
for(i = 0; i < n; i++) {
if(i != returnI) {
if(vrt(t[i], t[returnI]) == 1)
{
returnI = i;
}
}
}
return t[returnI];
}
使用这样的排序功能:
int pieni_dbl(void *a, void *b)
{
double *ad = a;
double *bd = b;
return *ad < *bd;
}
并称之为
double *parasDbl = getBest(dt, 6, sizeof(double), pieni_dbl);
short int *parasShort = getBest(st, 10, sizeof(short int), iso_itseis_short);
但是它给出了错误:算术中使用的'void *'类型的指针[-Wpedantic] if(vrt(t [i],t [paras])== 1)
为什么?有可能以某种方式将void指针作为参数传递给函数,并将其与ANSI c进行比较吗?
答案 0 :(得分:1)
鉴于t
具有类型void *
,执行函数调用错误两次(或三次)错误...
vrt(t[i], t[returnI])
......,就像你一样。
首先,考虑表达式t[i]
:它的类型是什么?当然,它的类型是void
。这不是相应函数参数的正确类型(甚至也不是函数参数的允许类型)。
编译器甚至没有抱怨这个,但考虑其含义。由于t[i]
的类型为void
,因此该程序甚至可以尝试计算它? void
有多大?实际上,它是未定义的,C禁止在void *
上执行算术。
也许你说“好的,但算术在哪里”?好吧,C根据指针算法定义数组索引。您的表达式t[i]
等同于*(t + i)
- 瞧,禁止使用void *
算术。
答案 1 :(得分:0)
原因是a[i]
形式是*(a + i)
的简写。因此,您正在撰写
if(vrt(*(t + i), *(t + returnI)) == 1)
但这涉及取消引用void *
,这是禁止的。