2017-11-20 6 views
0

Ich versuche, ein Programm zu machen, die eine bestimmte Summe, bis irgendwann gibt, die ich definieren, hier ist sie:Rekursionsfunktion; „... hat aufgehört zu arbeiten“

float sum(int n,float m); 

main(void) { 
    float a,m=1.0; 
    int n; 
    scanf_s("%ld", &n); 
    a = sum(n, m); 
    printf("%f", a); 
} 

float sum(int n, float m) { 
    if ((n/m) < 0.0005) { 
     return 0; 
    } 
    else { 
     return n/m + sum(n, m + 2); 
    } 
} 

(Beachten Sie, dass der Punkt I definiert ist 0,0005) wenn ich einen Wert größer oder gleich 5 geben, gibt mir Programm diese Fehler:

...has stopped working

auch wenn ich den definierten Punkt erhöhen 0,5 bis mag ich die Anzahl der Werte kann auch erhöht geben. Warum denkst du ist das passiert und wie kann ich es beheben?

+0

Mögliche Duplikat [Segmentierungsfehler mit scanf mit integer] (https://stackoverflow.com/questions/26247345/segmentation-fault-using-scanf- with-integer) – Alfabravo

+1

Aus Neugier, warum verwenden Sie eine '% ld' (für' long int') auf einem 'int'? Hast du irgendwelche Warnungen vom Compiler gesehen? – lurker

+1

@ Alfabravo diese Frage ist nicht anwendbar. Das OP verwendet richtigerweise "& n" für den Aufruf "scanf_s". – lurker

Antwort

1

Der Formatbezeichner %ld zu scanf_s erwartet ein long int * Argument. Was du passierst, ist ein int *. Diese Typen sind nicht kompatibel. Die Verwendung des falschen Formatbezeichners ruft undefined behavior auf, was sich in diesem Fall als Absturz manifestiert.

Die richtige Formatbezeichner für eine int * ist %d:

scanf_s("%d", &n); 

EDIT:

Der Absturz Sie sehen wahrscheinlich ein Stapelüberlauf ist. Die sum Funktion wird sich rekursiv selbst 1000 * n mal aufrufen. Ich sehe einen ähnlichen Fehler unter MSVC, aber an einer anderen Grenze. Sie können, indem Sie mit einer iterativen Lösung dieses Problem umgehen:

float sum(int n, float m){ 
    float result = 0; 
    while ((n/m) >= 0.0005){ 
    result += n/m; 
    m+=2; 
    } 
    return result; 
} 
+0

Können Sie erklären, warum es immer noch für das OP funktioniert, wenn 'n' Werte kleiner als 5 sind? Liegt es nur an einem unbestimmten Verhalten? Da OP 'scanf_s()' verwendet hat, muss er Microsoft verwenden, was ihm noch einen Kompilierzeitfehler für '% ld' geben sollte. – PhotometricStereo

+0

@PhotometricStereo Undefiniertes Verhalten. Das bedeutet, dass es abstürzen könnte, es könnte seltsame Ergebnisse geben, oder es könnte scheinen, richtig zu funktionieren. – dbush

+0

Okay, hier ist die Sache, ich habe den Spezifizierer geändert, um einen zu korrigieren. Aber ich habe immer noch einen Crash. Es funktioniert korrekt, bis ich die Eingabe "5" gebe.Wenn ich "5" -Programmstops für eine Sekunde gebe, ohne irgendwelche Ergebnisse zu geben, und dann mit demselben Fehler abstürzt. –

Verwandte Themen