2011-01-12 9 views
3

ので、私は電力を計算するために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を入力すると、nが1074790400になり、次に何が起こるかを推測することができます。
最初の関数がメインファイルから呼び出されています。私はそれについてgoogleの方法について考えることすらできません...
不思議なことに、私は1つのファイルに関数を書いて、それはうまく動作しますが、どちらもうまくいくはずです。これは事件です?

+0

コードに問題はありません。物事を乱すかもしれないことを省略した詳細はありますか? – Jacob

+1

この機能は私のシステムで正常に動作します。あなたの入力値は何ですか? – thkala

+0

省略しないと、main()を持つfirst.cがあり、最初に#include "powerを使用してpower()を呼び出した後に呼び出されます。h " – frankie

答えて

6

あなたがpower.cの上部に

#include "power.h" 

を持っていますか:(未テスト)のような単純なものについては何

ない場合、コンパイラはget_power()のプロトタイプは、呼び出しの時点では何であるかを知らないので、floatとして渡すの代わりにdoubleに最初の引数を促進することに頼るだろう。また、返されるfloatではなく、結果がintであると誤って判断します。

コンパイラが呼び出しの前にプロトタイプを見ると、よりうまくいくでしょう。

+0

mmmそれは...ええ、ちょうどそれを含んでいて、それは今働いています...私はまだヘッダーの周りに私の頭を得ることができません...この場合、メインのcファイルとpower.cにはpower.hが含まれているので、 – frankie

+2

はい、いつもガードを使うのが一番良いと思います。 – Jacob

+0

ヘッダーに特に必要な場合を除いて、常にガードをインクルードする必要がありますyの場合いくつかのxmacroトリッキーをやっています)。厳密に言えば、関数プロトタイプがあれば、複数のインクルードに問題はありません。 –

0

powmath.hです。 他の方法では、get_powerに乗算誤差があります。これはforに書き込んでください。

+0

Cで?math.hを意味しないのですか? –

+0

@Ninefingers:yes – 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で実行して、それが視覚的なスタジオの問題であるかどうかを確認しました。私はこの答えを持っています:

"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の警告として表示されます。

結論として、SHOULD NOTはコンパイルし、VSはそれをコンパイルしてリンクする唯一のコンパイラです。

関連する問題