2011-01-12 12 views
3

, so habe ich diese Funktion in C, um eine Leistung zu berechnen, und ich bin mit Visual C++ 2010Funktion immer falsche Werte

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); 
} 

nicht der beste Weg, es zu tun, ich weiß, aber das ist es nicht
wenn ich es debuggen die Werte werden korrekt gescannt (das heißt, die Werte sind richtig bis kurz vor dem Funktionsaufruf) aber dann wird beim Betreten der Funktion a 0 und n wird 1074790400, und du kannst raten, was als nächstes passiert ...
Die erste Funktion wird aus der Hauptdatei aufgerufen, ich habe den vollständigen Code eingefügt, weil ich wirklich keine Ahnung habe, was sein könnte gehe, und ich kann auf nicht einmal denken, wie es googeln ...
seltsam, ich schrieb die Funktion in einer einzigen Datei und es funktioniert gut, aber es sollte auf jeden Fall in beiden Richtungen

eine Ahnung, warum das passiert?

+0

Ich sehe kein Problem mit Ihrem Code. Gibt es irgendwelche Details, die Sie weggelassen haben, die Dinge verderben könnten? – Jacob

+1

Diese Funktion funktioniert gut auf meinem System. Was sind deine Eingabewerte? – thkala

+0

nicht viel mehr Details zu verzichten, gibt es first.c, die main() hat und ruft power(), nachdem es zu Beginn mit #include "power.h " – frankie

Antwort

6

Haben Sie

#include "power.h" 

an der Spitze der power.c haben?

Wenn nicht, wird der Compiler nicht weiß, was der Prototyp get_power() an der Stelle des Aufrufs ist, so wird es das erste Argument für die Förderung zu einem double statt vorbei es als float greifen. Es nimmt auch fälschlicherweise an, dass das Ergebnis ein int anstelle der float ist, die zurückgegeben wird.

Wenn der Compiler den Prototyp vor dem Aufruf sieht, werden die Dinge besser funktionieren.

+0

mmm gedruckt werden muss es ... ja, ich habe es einfach eingefügt und es funktioniert jetzt ... Mann, ich kann immer noch nicht meinen Kopf um Kopfzeilen ... in diesem Fall, da die Haupt-c-Datei und power.c sind einschließlich power.h, tun ich muss es bewachen? – frankie

+2

Ja, ich finde es am besten, nur Wächter die ganze Zeit zu verwenden – Jacob

+0

Sie sollten * immer * einschließen Wächter in Überschriften selbstverständlich einschließen, außer der Vorsatz spezifisch sie benötigt, um nicht dort zu sein wenn y du machst ein paar xmakro trickery). Genau genommen, wenn Sie nur Funktionsprototypen haben, gibt es kein Problem mit mehrfacher Einbeziehung. –

0

Sie können pow von math.h verwenden. Andernfalls haben Sie Fehler in der Multiplikation in get_power, schreiben Sie besser auf for.

+0

In C? Meinst du nicht math.h? –

+0

@Ninefingers: ja – Svisstack

0

Gab es einen bestimmten Grund, warum Sie Rekursion verwenden wollten?

Was etwas Einfaches wie (nicht getestet):

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

ja, Ich weiß, ich benutzte Rekursion, nur weil ich denke, Iteration ist einfacher, aber immer noch die Werte übergeben werden beim Betreten der Funktion, so würde ich das falsche Verhalten bekommen, auch wenn ich nur die Werte oder was auch immer – frankie

0

Nur um die vorhandene Antwort hinzuzufügen, habe ich dies auf xlc ausgeführt, um zu sehen, ob es ein visuelles Studio nur Problem war. Ich habe diese Antwort:

"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". 

Ich versuchte es auch in ein paar anderen Compilern, die ich hatte und habe Variationen über dieses Thema. Sie können dies als Warnung in VS sehen, wenn Sie die Warnstufe aufdrehen.

Also zum Schluss, es sollte nicht kompilieren, und VS ist der einzige, der kompiliert und verknüpft.