通过 void** 将参数传递给函数
Passing argument by void** to function
我正在尝试通过使用 void *
的函数传递参数以提供任何类型的参数。但是由于某些我不明白的原因,函数内部无法读取数据。
这是公司功能的复制行为。
Live on Coliru
#include <stdio.h>
typedef struct
{
double d1, d2;
} S;
double doStuff(void ** args)
{
double * a = (double*)args;
printf("a[0] = %lf\n", a[0]);
printf("a[1] = %lf\n", a[1]);
double r = a[0] + a[1];
return r;
}
int main(void) {
S s;
s.d1 = 10.0;
s.d2 = 10.0;
S* ptr = &s;
void* args[2];
args[0] = &ptr->d1;
args[1] = &ptr->d2;
double d = doStuff(args);
printf("d = %lf\n", d);
return 0;
}
它的输出
a[0] = 0.000000
a[1] = 0.000000
d = 0.000000
您应该将代码更改为:
double doStuff(void ** args)
{
double ** a = (double**)args;
printf("a[0] = %lf\n", *a[0]);
printf("a[1] = %lf\n", *a[1]);
double r = *a[0] + *a[1];
return r;
}
编辑
OP 要求更改 main
而不是 doStuff
(s/he 不拥有)。
现在,正如@Eugene Sh 所指出的,函数 doStuff
已瘫痪,因为它要求双指针参数,但用作指向双精度的指针。
main 中的更改只是传递一个指向 double 的指针,但强制转换为 void**
只是为了让编译器满意:
int main(void) {
S s;
s.d1 = 10.0;
s.d2 = 10.0;
S* ptr = &s;
double args[2]; // our pointer to double
args[0] = ptr->d1;
args[1] = ptr->d2;
double d = doStuff((void**)args); // cast to void**
printf("d = %lf\n", d);
return 0;
}
我正在尝试通过使用 void *
的函数传递参数以提供任何类型的参数。但是由于某些我不明白的原因,函数内部无法读取数据。
这是公司功能的复制行为。 Live on Coliru
#include <stdio.h>
typedef struct
{
double d1, d2;
} S;
double doStuff(void ** args)
{
double * a = (double*)args;
printf("a[0] = %lf\n", a[0]);
printf("a[1] = %lf\n", a[1]);
double r = a[0] + a[1];
return r;
}
int main(void) {
S s;
s.d1 = 10.0;
s.d2 = 10.0;
S* ptr = &s;
void* args[2];
args[0] = &ptr->d1;
args[1] = &ptr->d2;
double d = doStuff(args);
printf("d = %lf\n", d);
return 0;
}
它的输出
a[0] = 0.000000
a[1] = 0.000000
d = 0.000000
您应该将代码更改为:
double doStuff(void ** args)
{
double ** a = (double**)args;
printf("a[0] = %lf\n", *a[0]);
printf("a[1] = %lf\n", *a[1]);
double r = *a[0] + *a[1];
return r;
}
编辑
OP 要求更改 main
而不是 doStuff
(s/he 不拥有)。
现在,正如@Eugene Sh 所指出的,函数 doStuff
已瘫痪,因为它要求双指针参数,但用作指向双精度的指针。
main 中的更改只是传递一个指向 double 的指针,但强制转换为 void**
只是为了让编译器满意:
int main(void) {
S s;
s.d1 = 10.0;
s.d2 = 10.0;
S* ptr = &s;
double args[2]; // our pointer to double
args[0] = ptr->d1;
args[1] = ptr->d2;
double d = doStuff((void**)args); // cast to void**
printf("d = %lf\n", d);
return 0;
}