功能错误的值

时间:2011-01-12 01:40:54

标签: c visual-studio-2010

所以我在C中有这个功能来计算功率,我正在使用visual c ++ 2010

power.h

void power();  
float get_power(float a, int n);  

power.c

void power()
{
    float a, r;
    int n;
    printf("-POWER-\n");
    printf("The base: ");
    scanf("%f", &a);
    n = -1;
    while (n < 0)
    {
        printf("The power: ");
        scanf("%d", &n);
        if (n < 0)
        {
            printf("Power must be equal or larger than 0!\n");
        }
        else
        {
            r = get_power(a, n);
            printf("%.2f ^ %d = %.2f", a, n, r);
        }
    };
}

float get_power(float a, int n)
{
    if (n == 0)
    {
        return 1;
}
    return a * get_power(a, n-1);
}

不是最好的方法,我知道,但那不是它 当我调试它时,值被正确扫描(也就是说,值直到函数调用之前是正确的)但是在进入函数时a变为0而n变为1074790400,你可以猜到接下来会发生什么...
第一个函数是从主文件中调用的,我包含了完整的代码,因为我真的不知道会发生什么,我甚至无法思考如何谷歌... 奇怪的是,我在一个文件中编写了这个函数并且工作正常,但它肯定应该双向工作

知道为什么会这样吗?

4 个答案:

答案 0 :(得分:6)

你有吗

#include "power.h"

位于power.c的顶部?

如果没有,编译器不知道调用点get_power()的原型是什么,所以它会求助于将double的第一个参数提升为而不是将其作为一个float。它也会错误地认为结果是int而不是正在返回的float

如果编译器在调用之前看到原型,事情会更好。

答案 1 :(得分:0)

您可以使用pow中的math.h。 换句话说,get_power中的乘法有错误,最好在for上写一下。

答案 2 :(得分:0)

您是否有特定原因要使用递归?

像(未经测试的)简单的事情:

float get_power(float a, int n)
{
    float result = 1.0;
    for (int i = 0; i < n; i++)
    {
        result = result * a;
    }
    return result;
}

答案 3 :(得分:0)

只是为了添加现有的答案,我在xlc上运行它,看它是否只是一个视觉工作室问题。我得到了这个答案:

"power.c", line 25.7: 1506-343 (S) Redeclaration of get_power differs from previous declaration on line 19 of "power.c".
"power.c", line 25.7: 1506-050 (I) Return type "float" in redeclaration is not compatible with the previous return type "int".
"power.c", line 25.7: 1506-379 (I) Prototype for function get_power must contain only promoted types if prototype and nonprototype declarations are mixed.
"power.c", line 25.7: 1506-380 (I) Parameter 1 has type "float" which promotes to "double".

我也在其他一些编译器中尝试过这个主题,并对此主题进行了修改。如果你打开警告级别,你可以在VS中看到这个警告。

总而言之,它不应该编译,VS是唯一一个编译和链接它的人。