3 Stimmen

Funktion erhalten falsche Werte

Also habe ich diese Funktion in C, um eine Potenz zu berechnen, und ich benutze 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("Die Basis: ");
    scanf("%f", &a);
    n = -1;
    while (n < 0)
    {
        printf("Der Exponent: ");
        scanf("%d", &n);
        if (n < 0)
        {
            printf("Der Exponent muss größer oder gleich 0 sein!\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 die beste Art, es zu tun, ich weiß, aber das ist es nicht
wenn ich es debugge, werden die Werte korrekt eingelesen (das heißt, die Werte sind korrekt, bis kurz vor dem Funktionsaufruf), aber dann, beim Eintritt in die Funktion, wird a zu 0 und n wird zu 1074790400, und du kannst dir vorstellen, was als Nächstes passiert...
Die erste Funktion wird aus der Hauptdatei aufgerufen. Ich habe den vollständigen Code eingeschlossen, weil ich wirklich keine Ahnung habe, was los sein könnte, und ich kann nicht einmal darüber nachdenken, wie ich danach googeln soll...
Seltsamerweise habe ich die Funktion in einer einzelnen Datei geschrieben und sie funktioniert einwandfrei, aber sie sollte definitiv in beiden Richtungen funktionieren

Hast du eine Idee, warum das passiert?

6voto

Michael Burr Punkte 320591

Hast du

#include "power.h"

am Anfang von power.c?

Wenn nicht, weiß der Compiler nicht, was der Prototyp von get_power() ist, wenn der Aufruf erfolgt, daher wird er das erste Argument auf einen double umstellen, anstatt es als float zu übergeben. Er wird auch fälschlicherweise davon ausgehen, dass das Ergebnis ein int ist, anstatt des float, das zurückgegeben wird.

Wenn der Compiler den Prototyp vor dem Aufruf sieht, funktioniert alles besser.

0voto

Svisstack Punkte 15446

Sie können pow aus math.h verwenden. Andernfalls treten Fehler bei der Multiplikation in get_power auf, es ist besser, dies in einer for-Schleife zu schreiben.

0voto

Jonathan Wood Punkte 61798

Gibt es einen spezifischen Grund, warum du Rekursion verwenden wolltest?

Was ist mit etwas Einfachem 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;
}

0voto

ReaperUnreal Punkte 970

Nur um die vorhandene Antwort zu ergänzen, habe ich das auf xlc ausgeführt, um zu sehen, ob es ein Problem nur mit Visual Studio ist. Ich habe diese Antwort erhalten:

"power.c", Zeile 25.7: 1506-343 (S) Die Neudeklaration von get_power unterscheidet sich von der vorherigen Deklaration in Zeile 19 von "power.c".
"power.c", Zeile 25.7: 1506-050 (I) Rückgabetyp "float" in der Neudeklaration ist nicht kompatibel mit dem vorherigen Rückgabetyp "int".
"power.c", Zeile 25.7: 1506-379 (I) Prototyp für Funktion get_power muss nur promotete Typen enthalten, wenn Prototyp- und Nichtprototyp-Deklarationen gemischt sind.
"power.c", Zeile 25.7: 1506-380 (I) Parameter 1 hat den Typ "float", der zu "double" promotet wird.

Ich habe es auch in ein paar anderen Compilern ausprobiert, die ich zur Hand hatte, und erhielt Variationen dieses Themas. Dies kann als Warnung in VS gesehen werden, wenn Sie den Warnungslevel erhöhen.

Zusammenfassend sollte es NICHT kompilieren, und VS ist der einzige, der es kompiliert und verlinkt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X