首页 > 解决方案 > 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;
    }

}

标签: cvectorprintf

解决方案


你不需要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功能是否是个好主意。


推荐阅读