c - C 打印一个泛型类型向量
问题描述
您好我正在尝试创建一个以 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;
}
}
解决方案
你不需要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
很可能意味着你有 adouble
而不是 a 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
功能是否是个好主意。
推荐阅读
- reactjs - 无法获取 manifest.json 反应 webpack
- r - 将 wilcox.test 应用于数据框中的所有配对列
- reporting-services - CloudFlare 源证书在 SSRS 上配置
- reactjs - React App 在构建中没有媒体文件
- android - Jetpack Compose 中约束布局的权重
- python - 如何从 tif 使用 python netCDF4 创建 netCDF 文件?
- python - 使用 pandas 平衡数据集
- python - 模型中的 Django 3 动态默认值
- python - 带有 .toml 配置和预提交钩子的 Flakehell
- list - 我应该如何删除列表中的非数字使用序言