Frage
-
Das ist der GNU Compiler, bei dem ist das auch normal, dass der nicht davor warnt, wenn du keine Warnoptionen eingestellt hast. Was uns zum nächsten Punkt bringt: Compiliere als Anfänger immer mit allen Warnungen und siehe Warnungen als Fehler an. Beim GNU Compiler sind das die Schalter -Wall und -Wextra und optional noch -pedantic.
-
gcc, und der lässt sowas eig. nicht zu ;O
-
Ein "missing return-statement" ist lediglich ein warning ? Echt?
-
cvcv schrieb:
Ein "missing return-statement" ist lediglich ein warning ? Echt?
Ja! Und noch nicht einmal eine der Standardwarnungen die er auch ohne Warnoptionen bringt. Der Grund ist glaube ich, dass irgendwo in der Anleitung definiert ist, was genau da passiert. Und er geht davon aus, dass du diesen Abschnitt in der Anleitung kennst (ich kenne ihn nicht auswendig, daher kann ich ihn nicht zitieren) und das dort definierte Verhalten ausnutzt. It's not a bug, it's a feature!

edit: Das obige muss ich korrigieren: Es ist undefiniert! Und die Begründung, warum das nicht als Fehler gilt ist, dass das vom Standard ausdrücklich nur als undefiniertes Verhalten "definiert" wird. Und undefiniertes Verhalten ist kein Compilerfehler. Ich denke mal der Grund, warum das im Standard so gehandhabt wird, wird sein, damit man den Compilern keine umfangreiche statische Codeanalyse aufzwängt, die letztendlich sowieso scheitern muss, wenn auch noch äußere Einflüsse hinzukommen.
-
wie kann ich das also verändern?
tut mir leid das ich so viele fragen stelle , hoffe belestigt hir keinen
-
-ProGresS- schrieb:
wie kann ich das also verändern?
tut mir leid das ich so viele fragen stelle , hoffe belestigt hir keinen
Kommt drauf an, wie du compilierst. Auf der Kommandozeile schreibst du einfach
g++ -Wall -Wextra ...., falls du eine IDE verwendest, wirst du dieser mit Sicherheit auch irgendwelche Optionen geben können und bei einem Makefile ist die dafür vorgesehene Variable traditionell CXXFLAGS.
-
Du kannst am Ende der Funktion ein
return "echo";hinschreiben, damit die main() auch etwas hat, was sie ausgeben kann.Und für die Zukunft: Alle Compiler-Warnungen einschalten und ein gutes Buch zum Umgang mit C++ besorgen.
-
;O D.h er bastelt am Ende aber schon irgendein return-statment hin ( der compiler ) ?
Weil was sollte sonst hier passieren
int function_that_doesnt_return() { std::cout << "I wont return ;) " << std::endl; } int uninitialised; uninitialised = function_that_doesnt_return();
-
cvcv schrieb:
;O D.h er bastelt am Ende aber schon irgendein return-statment hin ( der compiler ) ?
Weil was sollte sonst hier passieren
int function_that_doesnt_return() { std::cout << "I wont return ;) " << std::endl; } int uninitialised; uninitialised = function_that_doesnt_return();Ich weiß jetzt nicht wie die calling conventions intern genau funktionieren, aber da ist ja sicherlich irgendwo ein Speicherbereich für die Rückgabe einer Funktion. Und wenn die einfach so endet ohne etwas hinein zu schreiben, dann steht da das gleiche wie vorher, also irgendwelcher Müll, wie bei einer uninitialisierten Variablen.
Soweit ich weiß ist das in C übrigens kein undefiniertes Verhalten, solange man die Rückgabe nicht benutzt.
-
jetzt aber was ich nicht ferstanden habe
wenn ich compelire mit g++ neu.cpp -o neu Zeigt der am ende :
Speicherzugriffsfehler
wenn ich g++ neu.cpp -o neu -Wall -Wextra zeigt der noch mher Feller:
neu.cpp: In function ‘std::string werten(std::string)’:
neu.cpp:33:1: warning: no return statement in function returning non-void
neu.cpp: In function ‘std::string podebnike(std::string)’:
neu.cpp:18:1: warning: control reaches end of non-void function
nick@nick-GA-790XTA-UD4:~/Arbeitsfläche/c++$was bringt also -Wextra und -Wall
danke sher für denn Tip. ich hab in moment 2 c++ Bücher aber leider ferstehe ich nicht alles da drine und wenn ich nicht probire lehrne ich nix.
IN moment das was in buch beschriben ist und die praktische aufgaben dazu kann ich amchen aber wenn ich wie jetzt versuche daraus was bischen großeres machen wird schon zu problem. Und glaube nur so kann man es lehrnen
-
-ProGresS- schrieb:
was bringt also -Wextra und -Wall
Da zeigt dir der Compiler einige zusätzliche Problemquellen an, die zwar ein Ergebnis bringen, aber nicht korrekt sind - wie in deinem Fall die fehlenden return-Anweisungen.
(die Funktion podebnike wird auch ohne gültigen Rückgabewert beendet, wenn beide if-Bedingungen fehlschlagen)
-
-ProGresS- schrieb:
jetzt aber was ich nicht ferstanden habe
wenn ich compelire mit g++ neu.cpp -o neu Zeigt der am ende :
SpeicherzugriffsfehlerNein, den Speicherzugriffsfehler macht dein Programm, nicht der Compiler. Das ist ein ganz großer Unterschied.
wenn ich g++ neu.cpp -o neu -Wall -Wextra zeigt der noch mher Feller:
neu.cpp: In function ‘std::string werten(std::string)’:
neu.cpp:33:1: warning: no return statement in function returning non-void
neu.cpp: In function ‘std::string podebnike(std::string)’:
neu.cpp:18:1: warning: control reaches end of non-void function
nick@nick-GA-790XTA-UD4:~/Arbeitsfläche/c++$Du bist gut. "Nur noch mehr Fehler". Der zeigt diese Fehler weil sie da sind! Das sind die Gründe für deinen Speicherzugriffsfehler.
-
Alles klar.
danke sehr für Ihre Hilfe.
MFG Nick
-
Lösung für das Problemm ist :
#include <iostream> #include <string> using namespace std; string podebnike(string pPodebnike) { if (pPodebnike == "Damian") { return "POlle"; } else if (pPodebnike == "Daniel") { return "Rapper"; } else { return "Keiner von beiden"; } } string werten(string pName) { string temp; if (pName == "Podebnik") { cout << "welchen Damian oder Daniel?"; cin >> temp; return podebnike(temp); } else { return "Name nicht gefunden"; } } int main() { string name; cout<< "Bitte ein Name: "; cin>> name; cout<< werten(name) << endl; return 0; }