无法进行类型转换'无效*'到'加倍*'也不是浮动的'使用C语言

时间:2015-05-19 03:07:46

标签: c pointers compiler-errors

很抱歉,如果这个问题在某个地方已经有解决方案,但我发现的所有类似问题的答案都没有帮助我。

void imprimePilhaDouble (void *vetor, int tam)
{
    int i;
    double *vetorDouble;

    vetorDouble = (double*) vetor;

    for (i = 0; i < tam; ++i)
    {
        printf("%e\t", *((double*) vetorDouble[i]));
    }
    printf("\n");
}

void imprimePilhaFloat (void *vetor, int tam)
{
    int i;
    float *vetorFloat;

    vetorFloat = (float*) vetor;

    for (i = 0; i < tam; ++i)
    {
        printf("%f\t", *((float*) vetorFloat[i]));
    }
    printf("\n");
}

上面的代码在编译时返回这些错误:

In function 'imprimePilhaDouble'
erro: cannot convert to a pointer type
In function 'imprimePilhaFloat'
erro: cannot convert to a pointer type

分别为printf("%e\t", *((double*) vetorDouble[i]));行和printf("%f\t", *((float*) vetorFloat[i]));行。 有没有办法阻止这些错误?我做了另一个似乎正常工作的类似功能:

void imprimePilhaInteiro (void *vetor, int tam)
{
    int i, *vetorInt;

    vetorInt = (int*) vetor;

    for (i = 0; i < tam; ++i)
    {
        printf("%d\t", *((int*) vetorInt[i]));
    }
    printf("\n");
}

2 个答案:

答案 0 :(得分:3)

问题是这一行:

printf("%e\t", *((double*) vetorDouble[i]));

尝试将double投射到double *。您不能将浮点值强制转换为指针,因此您会收到报告的错误。您的float函数也会发生同样的事情。

当您将int投射到int *时,这不会导致错误,但几乎是无稽之谈。

你想做什么?

答案 1 :(得分:0)

vetor是(void *)

vetorDouble已投放到(double *)

vectorDouble [i]实际上是*(vetorDouble + i),即基地址vetorDouble指向的内容,偏移量为(i)* size(double),因为vetorDouble是类型为(* double)

所以,vetorDouble [i]是*(vectorSouble+i)

已经是双重了。你不需要再次将其转换为(double*),并且当它告诉你不能将double转换为a(double *)时编译器是正确的:它没有意义。< / p>

所以,你必须写:

void imprimePilhaDouble (void *vetor, int tam)
{
    double *vetorDouble = (double*) vetor;

    for (i = 0; i < tam; ++i)
    {
        printf("%e\t", vetorDouble[i]);
    }
    printf("\n");
}

你甚至可以写(因为,读取你的功能名称,它等待一个双倍):

void imprimePilhaDouble (double *vetorDouble, int tam)
{
    for (i = 0; i < tam; ++i)
        printf("%e\t", vetorDouble[i]);

    printf("\n");
}