我需要编写一个函数,该函数将一个空指针(表示一个数组)和一个代表数组长度的整数作为参数。在函数中,我需要将此空指针转换为双精度指针。问题是void指针可以表示整数或浮点数或双精度数的数组。 因此,如果void指针代表整数或浮点数的数组,以下内容显然不起作用:
void foo(void *v,int n){
double *values;
values=(double*)v;
for(i=0;i<n;i++)
printf("%f\n",values[i]);
}
所以这将打印正确的输出:
foo((double[]){1,2,3,4},4);
这将输出错误的输出:
foo((int[]){1,2,3,4},4);
foo((float[]){1,2,3,4},4);
那么...仅在知道它可以是整数或浮点数或双精度数组的情况下,是否可以将void指针正确地转换为双精度指针?并且是否必须具有数组的长度,或者我可以以某种方式计算它? P.s.不使用回调
答案 0 :(得分:0)
仅在知道空指针可以是整数数组,浮点数或双精度数组的情况下,我才能正确地将void指针转换为双精度指针吗?
不,您不能。您需要以某种方式传递类型信息。
是否需要具有数组的长度,或者我可以通过某种方式进行计算?
必须传递长度。
您可以“隐藏”结构中的信息
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum etype { INTEGER, FLOAT, DOUBLE };
struct data {
void *values;
size_t n;
enum etype type;
};
void foo(struct data *x) {
int *xd = x->values;
float *xf = x->values;
double *xg = x->values;
for (int k = 0; k < x->n; k++) {
switch (x->type) {
default: printf("%g ", xg[k]); break;
case FLOAT: printf("%f ", xf[k]); break;
case INTEGER: printf("%d ", xd[k]); break;
}
}
puts("");
}
int main(void) {
struct data x;
x.values = malloc(4 * sizeof(int));
((int*)(x.values))[0] = 42;
((int*)(x.values))[1] = -1;
((int*)(x.values))[2] = 0;
((int*)(x.values))[3] = 999;
x.n = 4;
x.type = INTEGER;
foo(&x);
x.values = calloc(4, sizeof(float));
x.type = FLOAT;
float tmp = 3.14159;
memcpy(((float*)(x.values))+1, &tmp, sizeof (float));
foo(&x);
free(x.values);
x.values = calloc(4, sizeof(double));
x.type = DOUBLE;
((double*)(x.values))[2] = 2.7182818;
foo(&x);
free(x.values);
}