Visual Studio 2017



  • Hey Community,
    ich habe ein kleines Problem, ich habe vor kurzem angefangen mir selbst C++ beizubrungen und ich kann den Fehler meines Codes nicht finden. Soweit funktioniert an dem Code alles aber die Anweisung "std::cin.get();" funktioniert nicht. Die Anwendung schließt sich immer direkt nach Eingabe des Alters.

    Hier der Code:

    #include <iostream>
    
    int main(void) {
    	std::cout << "Geben Sie Ihr Alter an!" << std::endl;
    
    	int alter;
    	std::cin >> alter;
    
    	if (alter <= 18) {
    		std::cout << "Sie duerfen Auto fahren!" << std::endl;
    	}
    	else {
    		std::cout << "Sie duerfen kein Auto fahren!" << std::endl;
    	}
    	std::cin.sync();
    	std::cin.get();
    
    }
    


  • die Anweisung "std::cin.get();" funktioniert nicht

    Sie macht wohl eher nicht das was du annimmt.

    Starte das Programm mit Strg+F5 und gut iss.



  • Außerdem solltest du mal deine Logik überdenken. 0- bis 18-jährige dürfen Auto fahren, ab 19 Jahren aber nicht mehr?



  • Nutzer1337 schrieb:

    Hey Community,
    ich habe vor kurzem angefangen mir selbst C++ beizubrungen

    1.Ja das sieht man... Nutze "using namespace std;", dann esparst du dir das unnötige std:: vor cin und cout

    2. weißt du was Code-tags sind? 😡
    3. weißt du was ein Rückgabewert ist? Du schreibst int main, gibts aber nirgendwo einen int zurück. Hör auf zu knaupen und versuch direkt von Anfang an sauber zu programmieren.



  • uiuiui schrieb:

    3. weißt du was ein Rückgabewert ist? Du schreibst int main, gibts aber nirgendwo einen int zurück.

    Das ist so vollkommen in Ordnung.



  • uiuiui schrieb:

    Nutzer1337 schrieb:

    Hey Community,
    ich habe vor kurzem angefangen mir selbst C++ beizubrungen

    1.Ja das sieht man... Nutze "using namespace std;", dann esparst du dir das unnötige std:: vor cin und cout

    Dein Ernst? Jede vernünftige Lektüre wird dir sagen, du sollst das nicht machen. Der Name ist absichtlich so kurz, damit es eben kein wirklicher Mehraufwand ist. Lass ihn std:: schreiben, das ist gut und richtig so!



  • anti-freak schrieb:

    uiuiui schrieb:

    Nutzer1337 schrieb:

    Hey Community,
    ich habe vor kurzem angefangen mir selbst C++ beizubrungen

    1.Ja das sieht man... Nutze "using namespace std;", dann esparst du dir das unnötige std:: vor cin und cout

    Dein Ernst? Jede vernünftige Lektüre wird dir sagen, du sollst das nicht machen.

    Warum nicht?



  • uiuiui schrieb:

    3. weißt du was ein Rückgabewert ist? Du schreibst int main, gibts aber nirgendwo einen int zurück. Hör auf zu knaupen und versuch direkt von Anfang an sauber zu programmieren.

    main() braucht kein return Statement... 😉



  • audacia schrieb:

    anti-freak schrieb:

    uiuiui schrieb:

    Nutzer1337 schrieb:

    Hey Community,
    ich habe vor kurzem angefangen mir selbst C++ beizubrungen

    1.Ja das sieht man... Nutze "using namespace std;", dann esparst du dir das unnötige std:: vor cin und cout

    Dein Ernst? Jede vernünftige Lektüre wird dir sagen, du sollst das nicht machen.

    Warum nicht?

    1. Namespaces haben nicht nur rein syntaktische Zwecke, sondern auch semantische. Es ist für dritte deutlich schwieriger nachzuvollziehen, ob du jetzt mit vector einen std::vector meinst, oder einen mathematischen vector, oder irgendwas ganz anders, wenn du das std nicht schreibst. Hat hier vor allem den Sinn des besseren Verständnisses.

    2. Je nachdem, wo du dieses using namespace std tatsächlich nutzt, kann es zu Kollisionen mit anderen classes/structs/Funktionen oder was auch immer kommen. Es ist eine Sache, das local in eine Funktion einzubinden, es aber per Header global im gesamten Programm bereit zu stellen, ist das schlechteste was man machen kann. Der globale namespace ist kein Ablageort für Namen, nur weil man zu faul ist, 3 Buchstaben und 2 Doppelpunkte zu schreiben.

    3. Der c++ Standard selbst benutzt den globalen namespace schon, um Funktionen und typedefs aus dem C Raum bereit zu stellen. Zum std::memset gibt es ein memset. Zum std::size_t gibt es ein size_t. Das sind alles Dinge, die unter Umständen durcheinander geraten können, und dich vor Probleme stellen, die du nicht haben müsstest.

    4. Intellisense. In IDEs werden dir anhand von std:: bereits auto Vorschläge gemacht. Das wird unter Garantie auch durcheinander kommen, wenn du das alles in den globalen namespace packst.

    Solltest du using namespace std nur innerhalb eines sehr begrenzten Bereichs nutzen, ist das sehr wohl in Ordnung (Funktionen), auch wenn ich es dort genauso wenig mag. In einem Header hat das aber absolut nichts zu suchen!



  • anti-freak schrieb:

    Solltest du using namespace std nur innerhalb eines sehr begrenzten Bereichs nutzen, ist das sehr wohl in Ordnung (Funktionen), auch wenn ich es dort genauso wenig mag. In einem Header hat das aber absolut nichts zu suchen!

    Na, das klingt ja schon viel reflektierter. Auch wenn es mir artifiziell vorkommt, daß du das nur auf Funktionsebene zulassen willst und nicht auch für Source-Dateien.

    Nachdem ich im angegebenen Beispiel weder eine Headerdatei noch eine drohende Mehrdeutigkeit sehen kann, finde ich die using namespace -Deklaration hier ok. Wenn er Intellisense will, muß er halt Ctrl+Space drücken, zumindest VS kommt da nicht durcheinander.



  • audacia schrieb:

    anti-freak schrieb:

    Solltest du using namespace std nur innerhalb eines sehr begrenzten Bereichs nutzen, ist das sehr wohl in Ordnung (Funktionen), auch wenn ich es dort genauso wenig mag. In einem Header hat das aber absolut nichts zu suchen!

    Na, das klingt ja schon viel reflektierter. Auch wenn es mir artifiziell vorkommt, daß du das nur auf Funktionsebene zulassen willst und nicht auch für Source-Dateien.

    Nachdem ich im angegebenen Beispiel weder eine Headerdatei noch eine drohende Mehrdeutigkeit sehen kann, finde ich die using namespace -Deklaration hier ok. Wenn er Intellisense will, muß er halt Ctrl+Space drücken, zumindest VS kommt da nicht durcheinander.

    Ich habe das durchaus bewusst so formuliert. Immerhin war das Argument für das exposen von std mehr als fragwürdig ("dann esparst du dir das unnötige std:: vor cin und cout "). Auch wenn es vielen nicht gefällt, aber der namespace std ist generell nicht dazu gedacht, durch using namespace aufgelöst zu werden. Kann prinzipiell jeder machen wie er will, sofern er alleine im Code unterwegs ist. Dennoch halte ich es für die falsche Herangehensweise, Neulingen sowas direkt als "best practice"-Empfehlung mitzugeben.


  • Mod

    Immerhin war das Argument für das exposen von std mehr als fragwürdig ("dann esparst du dir das unnötige std:: vor cin und cout ").

    😕 Wofür soll man std sonst exposen?

    audacia schrieb:

    Auch wenn es mir artifiziell vorkommt, daß du das nur auf Funktionsebene zulassen willst und nicht auch für Source-Dateien.

    Ich glaube nicht, dass (mit Doppel-s, Opa) das Wort "artifiziell" hier Sinn ergibt. </ot> Seine Beschränkung ist mMn. nachvollziehbar: Viele Source Dateien werden tausende Zeilen lang, und sind dann ebenso wenig überschaubar wie das Kollektiv aller einen Header einbindenden Source Dateien. Ich tendiere mittlerweile dazu, oft verwendete Entitäten innerhalb von Source Dateien mittels using zu deklarieren. Ganz auskippen muss man seine Namensräume nur selten.



  • [quote="wob"]Außerdem solltest du mal deine Logik überdenken. 0- bis 18-jährige dürfen Auto fahren, ab 19 Jahren aber nicht mehr?[/quote]
    Sorry war mein Fehler, hätte ich vielleicht gesehen, wenn das Programm sich nicht sofort geschlossen hätte.



  • Danke für die ganzen Antworten, ich weiß jetzt aber immer noch nicht wie ich dafür sorge, dass das Programm sich nicht sofort schleißt.



  • manni66 schrieb:

    Starte das Programm mit Strg+F5 und gut iss.

    Oder starte es in einer Konsole.



  • DirkB schrieb:

    manni66 schrieb:

    Starte das Programm mit Strg+F5 und gut iss.

    Oder starte es in einer Konsole.

    Oder setze einen Breakpoint am Ende der main() Funktion.



  • [quote="dot"][quote="DirkB"][quote="manni66"]Starte das Programm mit Strg+F5 und gut iss.[/quote]
    Oder starte es in einer Konsole.[/quote]
    Oder setze einen Breakpoint am Ende der main() Funktion.[/quote]
    Mit Strg + F5 ändert sich nichts und wie setze ich einen Breakpoint?





  • Da dies alles Möglichkeiten sind, wo nur noch die Möglichkeit besteht, die Konsole über das Schließkreuzchen zu beenden, kannst Du ebenso gut eine kleine Endloschleife ans Ende der main() zu schreiben.

    Allerdings verstehe ich das Problem nicht. Stört es, das nur einmal das Alter abgefragt wird? Dann schreibe die Schleife um alle Anweisungen, als Bonus vielleicht eine Abfrage, wie diese Endlosschleife dann doch verlassen wird.



  • [quote="lemon03"]Allerdings verstehe ich das Problem nicht. Stört es, das nur einmal das Alter abgefragt wird? .[/quote]
    Das Problem ist das eben danach kein weiterer Code mehr geschrieben werden kann, wie du schon meintest, das man es nur noch durch schließen beenden kann. Das Programm schließt so schnell das nicht mal mehr die möglichkeit besteht den ausgegebenen Text zu lesen.


Anmelden zum Antworten