warning C4715
-
Hallo,
Ich bekomme beim Debug-Durchlauf 1 Warnung die lautet wie folgt:
warning C4715: 'go_on' : Nicht alle Steuerelementpfade geben einen Wert zurück
Mein Code sieht so aus und ich wüsste nicht, wie und wieso man das ändern sollte. Will die Warnung aber weghaben.
Danke im Voraus.
Codeabschnitt:
bool go_on(void) { char yn = 'j'; cout << "\nWeitere Berechnungen durchfuehren (j = ja | n = nein)? "; cin >> yn; if (yn=='j') { return true; } else if(yn=='n') { return false; } else { cout << "Bitte geben Sie einen gueltigen Wert ein!"; go_on(); } }
Hinweis: Wird in der main-function verwendet in Form von:
void main(void) { do { //... }while(go_on()); }
edit: kA wie man C++ Code einsetzt, da steht C# ; Ist aber C++ Code !
-
Es muss so heißen:
else { cout << "Bitte geben Sie einen gueltigen Wert ein!"; return go_on(); }
Cpp-Tags macht man mit [ cpp] und [/ cpp], sind unten gleich links unter den Smilys.
Gruß
-
Dein Compiler erkennt in diesem Fall die Rekursion nicht.
Basics:
a) Die Funktion returned einen bool. Das heißt, dass egal wie die Funktion abläuft am Ende ein "return <irgendein bool>" stehen muss.b) Ein Steuerelementpfad ist ein Pfad den das Programm bei einem if nimmt (du hast 3 davon in der Funktion (if, else if und den else)).
c) In den ersten beiden steht jeweils ein return, im else-Pfad hingegen nicht. Dort ruft die Funktion stattdessen sich selbst auf (Rekursion) um nochmals abzulaufen.
d) Es ist erwünscht, dass der 1. Aufruf in diesem Fall das Ergebnis des 2. Aufrufes zurückgibt. Korrekt wäre also an der Stelle:
else { cout << "Bitte geben Sie einen gueltigen Wert ein!"; return go_on(); }
Ich hoffe ich hab das halbwegs verständlich für diese Zeit erklärt
MfG SideWinder
-
Danke euch beiden ! (Button hab ich auch gefunden
)
-
Djinndrache schrieb:
warning C4715: 'go_on' : Nicht alle Steuerelementpfade geben einen Wert zurück
Das ist ein Übersetzungsfehler. Nicht immer hat "control" die Bedeutung "Steuerelement". Darum rate ich davon ab, mit übersetzten Versionen einer IDE zu arbeiten.
Im Übrigen würde ich dir raten, dir dieses Konstrukt "Bequemlichkeitsrekursion" nicht anzugewöhnen. Das könntest du sauberer mit einer Schleife lösen. Selbst ein goto wäre hier IMHO besser.
-
SideWinder schrieb:
Dein Compiler erkennt in diesem Fall die Rekursion nicht.
Quatsch, der dritte Fall hat keinen Rückgabewert. Der Compiler hat recht.
Bye, TGGC (Das Jahr des Helden)
-
TGGC schrieb:
SideWinder schrieb:
Dein Compiler erkennt in diesem Fall die Rekursion nicht.
Quatsch, der dritte Fall hat keinen Rückgabewert. Der Compiler hat recht.
Bye, TGGC (Das Jahr des Helden)
überleg mal wie recursion abläuft.
-
@MFK
Naja, das rekursiv zu lösen muss nicht sein, aber ob ein goto besser wäre?
Das ist so ziemlich die überflüssigste Anweisung in C++ und bringt nur ärger.Was die Fehlermeldungen anbelangt sind die englischen auch nicht immer sehr überzeugend. Sollte mir vielleicht die indische Version kaufen....... :xmas1:
-
b7f7 schrieb:
TGGC schrieb:
SideWinder schrieb:
Dein Compiler erkennt in diesem Fall die Rekursion nicht.
Quatsch, der dritte Fall hat keinen Rückgabewert. Der Compiler hat recht.
Bye, TGGC (Das Jahr des Helden)
überleg mal wie recursion abläuft.
Überleg du lieber, wie die abläuft. Der Compiler weisst korrekt darauf hin, das die Rekursion hier nicht richtig gebaut wurde.
Bye, TGGC (Das Jahr des Helden)
-
-
TGGC|_work schrieb:
b7f7 schrieb:
TGGC schrieb:
SideWinder schrieb:
Dein Compiler erkennt in diesem Fall die Rekursion nicht.
Quatsch, der dritte Fall hat keinen Rückgabewert. Der Compiler hat recht.
Bye, TGGC (Das Jahr des Helden)überleg mal wie recursion abläuft.
Überleg du lieber, wie die abläuft. Der Compiler weisst korrekt darauf hin, das die Rekursion hier nicht richtig gebaut wurde.
Bye, TGGC (Das Jahr des Helden)ich habe nur deine antwort darauf falsch verstanden.
Es ist doch klar das der Compiler nicht erkennt, das beabsichtigt ist, dass Ergäbnis der Rekursion zurückzugeben.
SideWinder hat schon die richtige Lösung geposted.
der dritte fall muss einen Wert Returnen, was der OP nicht tat.
-
Also ist das doch richtig so mit return go_on(); !?