2011-01-12 5 views
3

는 그래서 난 전력을 계산하는 C에서이 기능을 가지고 있고, 나는 비주얼 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); 
} 

그것을 할 수있는 가장 좋은 방법은 아니지만, 그게 아니야
내가 그것을 디버깅 할 때 값이 정확하게 스캔됩니다 (즉, 값은 함수 호출 직전까지 정확합니다). 그러나 함수를 입력하면 0이되고 n은 1074790400이되며 다음에 어떤 일이 일어날 지 추측 할 수 있습니다 ...
첫 번째 함수는 주 파일에서 호출됩니다. 진행하고, 심지어 이상하게도 ... 그것을 위해 구글 방법에
을 생각할 수 없다, 나는 하나의 파일에서 함수를 작성하고 그것을 잘 작동하지만, 확실히 두 가지

어떤 생각이 왜 작동합니다 이 일이 일어 났나요?

+0

코드에 어떤 문제도 나타나지 않습니다. 물건을 엉망으로 만들었다면 생략 한 세부 사항이 있습니까? – Jacob

+1

이 기능은 내 시스템에서 정상적으로 작동합니다. 입력 값은 무엇입니까? – thkala

+0

더 이상 생략 할 세부 사항이 없으면 main()이 있고 powerinclude "power를 사용하여 처음에 포함시킨 후 power()를 호출하는 first.c가 있습니다.h " – frankie

답변

6

당신이 power.c의 상단에

#include "power.h" 

이 있습니까?

그렇지 않은 경우는, 컴파일러는 get_power()의 프로토 타입이 호출의 시점에서 무엇인지 모르는, 그래서 그것은 double에 첫 번째 인수를 추진 대신 float로 전달에 의존합니다. 또한 결과가 float 대신에 int이라고 잘못 가정합니다.

컴파일러가 호출 전에 프로토 타입을 보면 더 잘 작동합니다.

+0

mmm이어야합니다. 그것 ... 그래, 그냥 그것을 포함하고 지금은 작동 ... 남자 나는 여전히 머리 주위에 내 머리를 얻을 수 없다 ...이 경우, 메인 c 파일 및 power.c 이후 power.h 포함, 할 – frankie

+2

예. 항상 경비원을 항상 사용하는 것이 가장 좋습니다. – Jacob

+0

머리글에 특별히 경비가 필요하지 않는 한, 경비원을 반드시 포함시켜야합니다. y 인 경우 ou는 xmacro 속임수를하고있다.) 엄밀히 말하면, 함수 프로토 타입을 가지고 있다면 다중 포함에 아무런 문제가 없습니다. –

0

powmath.h에서 사용할 수 있습니다. 다른 방법으로 승수가 get_power 인 경우 for에 더 잘 쓰십시오.

+0

C에서? math.h를 의미하지 않습니까? –

+0

@Ninefingers : 예 – Svisstack

0

재귀를 사용하려는 구체적인 이유가 있습니까?

무엇 (테스트되지 않은) 같은 간단한 무언가에 관하여 :

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

예, 난 그냥 재귀를 사용하기 때문에, 나는 반복이 간단하다고 생각하지만, 전달 된 값은 함수를 입력 할 때 바뀌기 때문에, 나는 값이나 무엇을 인쇄해도 잘못된 동작을 얻게 될 것입니다. – frankie

0

그냥 기존 답변에 추가하기 위해 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 만 컴파일하고 링크합니다.

관련 문제