所以我在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,你可以猜到接下来会发生什么...
第一个函数是从主文件中调用的,我包含了完整的代码,因为我真的不知道会发生什么,我甚至无法思考如何谷歌...
奇怪的是,我在一个文件中编写了这个函数并且工作正常,但它肯定应该双向工作
知道为什么会这样吗?
答案 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是唯一一个编译和链接它的人。