将 void 指针作为参数传递

passing void pointer as parameter

所以我正在尝试根据我的排序函数在这样的函数中获取值。

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] 如果(vrt(t[i], t[paras]) == 1)

这是为什么?是否有可能以某种方式将 void 指针作为参数传递给在 ANSI c 中比较它的函数?

原因是 a[i] 的形式对于 *(a + i) 是 shorthand。因此,你写的是

if(vrt(*(t + i), *(t + returnI)) == 1)

但这涉及取消引用 void *,这是被禁止的。

鉴于 t 的类型为 void *,两次(或三次)执行函数调用是错误的...

vrt(t[i], t[returnI])

...,如你所愿。

首先,考虑表达式t[i]:它的类型是什么?它的类型当然是void。这不是相应函数参数的正确类型(甚至不是函数参数允许的类型)。

编译器甚至都懒得抱怨,但要考虑其中的含义。由于 t[i] 的类型为 void,程序怎么可能去尝试计算它呢? void 有多大?事实上,它是未定义的,C 禁止对 void *.

进行运算

也许你是说 "Ok, but where's the arithmetic"?好吧,C 根据指针算术定义数组索引。您的表达式 t[i] 等同于 *(t + i) - 瞧,带有 void *.

的禁止算术