嗨,我正在尝试创建一个将void *指针作为参数的函数,并使用printf打印矢量的所有元素
该函数的声明为:
void print_vec(void *vec,int dime_se,int dime,char *format);
,实现为:
void print_vec(void *vec,int dime_se,int dime,char *format){
for(int i=0;i<dime;i++)
printf(format,*(vec+dime_se*i));
}
问题是当我编译时,编译器返回:
error: invalid use of void expression printf(format,*(vec+dime_se*i));
那么问题是有一种方法可以完成此任务而无需做到这一点?
void print_vec(void *vec,int dime_se,int dime,char *format){
for(int i=0;i<dime;i++)
switch(format[1]){
case 'c':
printf(format,*((char*)(vec+dime_se*i)));
break;
case 'd':
printf(format,*((unsigned int*)(vec+dime_se*i)));
break;
case 's':
printf(format,*((char**)(vec+dime_se*i)));
break;
case 'i':
printf(format,*((int*)(vec+dime_se*i)));
break;
case 'f':
printf(format,*((float*)(vec+dime_se*i)));
break;
default:
break;
}
}
答案 0 :(得分:4)
您不需要dime_se
参数。大小或多或少地隐含在格式字符中。
另外,如果强制转换为正确的指针类型,则可以让C进行缩放而不是进行缩放
手动:
#include <stddef.h>
#include <stdio.h>
void print_vec(void const*vec,size_t dime,char const*format)
{
for(size_t i=0;i<dime;i++)
switch(format[1]){
#define X(Char,Tp) break;case Char: printf(format,((Tp*)vec)[i])
X('c',char);
X('d',unsigned);
X('s',char*);
X('i',int);
X('f',float);
break;default: return;
#undef X
}
}
我之所以说得差不多,是因为类型提升有点使线条模糊。 %f
很可能意味着您拥有double
而不是float
。
如果您想使用dime_se
参数消除这种情况的歧义,则可以:
break;case 'f':
if(sizeof(double)==dime_se)
printf(format,((double*)vec)[i]);
else {
assert(sizeof(float)==dime_se);
printf(format,((float*)vec)[i]);
}
但是我不确定像这样的print_vec
函数是否是个好主意。