将 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 *
.
的禁止算术
所以我正在尝试根据我的排序函数在这样的函数中获取值。
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 *
.