функция получает неправильные значения - PullRequest
3 голосов
/ 12 января 2011

, поэтому у меня есть эта функция в 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, и вы можете догадаться, что будет дальше ...
первая функция вызывается из основного файла, я включил полный код, потому что я действительно понятия не имею, что может происходить, и я даже не могу думать о том, как Google для этого ...
странно, я написал функцию в одном файле, и она отлично работает, но она определенно должна работать в обоих направлениях

есть идеи, почему это происходит?

Ответы [ 4 ]

6 голосов
/ 12 января 2011

У вас есть

#include "power.h"

вверху power.c?

Если нет, то компилятор не знает, какой прототип get_power() находится в точке вызова, поэтому он прибегнет к преобразованию первого аргумента в double вместо передачи его как float , Также будет неверно предположено, что результатом является int вместо float, который возвращается.

Если компилятор увидит прототип перед вызовом, все будет работать лучше.

0 голосов
/ 12 января 2011

Просто чтобы добавить к существующему ответу, я запустил его на xlc, чтобы посмотреть, была ли это проблема только для visual studio. Я получил этот ответ:

"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 является единственным, который компилирует и связывает его.

0 голосов
/ 12 января 2011

Была ли какая-то конкретная причина, по которой вы хотели использовать рекурсию?

Как насчет чего-то простого (непроверенного):

float get_power(float a, int n)
{
    float result = 1.0;
    for (int i = 0; i < n; i++)
    {
        result = result * a;
    }
    return result;
}
0 голосов
/ 12 января 2011

Вы можете использовать pow из math.h. В противном случае у вас есть ошибка при умножении в get_power, лучше напишите это на for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...