我需要写一个函数,它以空指针(表示数组)和整数(表示数组的长度)作为参数。在函数中,我需要将这个空指针转换为双精度指针。问题是空指针可以表示整数、浮点数或双精度数组。因此,在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);所以..。在知道空指针可以是整数、浮点数或双精度数组的情况下,我能正确地将空指针转换为双精度一吗?有必要知道数组的长度吗?或者我可以通过某种方式来计算它?附注:不使用回调
发布于 2019-05-01 16:27:19
在知道空指针可以是整数数组、浮点数或双精度数组的情况下,我能正确地将空指针转换为双精度一吗?
不,你不能。您需要以某种方式传递类型信息。
,是否有必要有数组的长度,或者我可以以某种方式计算它?
传递长度是必要的。
您可以将信息“隐藏”在结构中。
#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);
}https://stackoverflow.com/questions/55933284
复制相似问题