Frage zu Exceptions



  • Jemand, der mit Code wie

    string* str=new string("asdf");
    

    aufwartet und Einrücken für das entscheidende Kriterium der Codequalität hält, dessen Code kann nur totaler Schrott sein (so sinnvoll Einrückung auch ist).

    Das ist aber auch nicht so richtig schlimm -- immerhin bist du ganz offensichtlich Anfänger. Nur solltest du dich nicht auf imaginären Lorbeeren ausruhen, weil du irgendwas zusammengeschustert hat, was für den Moment einigermaßen hält. Bei dem, was ich bisher von dir gesehen habe, gehe ich beispielsweise jede Wette ein, dass dein Code Speicher leckt wie ein Küchensieb.



  • Verlink mal bitte deinen anderen Thread, bin zu faul zum suchen.


  • Mod

    Kellerautomat schrieb:

    Verlink mal bitte deinen anderen Thread, bin zu faul zum suchen.

    Alle Beiträge von Nikolai anzeigen, FTW! Er meinst diesen Thread:
    http://www.c-plusplus.net/forum/305611

    500 Zeilen Code mit der Aufforderung "Ich habe zwar keine Frage, aber schaut trotzdem mal durch, ihr habt schließlich sonst nix zu tun". Kein Wunder, dass dort niemand geantwortet hat. Zu den Winapizeugs kann ich nix sagen, außer dass ich mir da einen Wrapper machen würde, anstatt so wild am C-Interface rumzufummeln, der Rest des Codes ist so typischer "C++ von A bis Z"-Stil (das ist kein Kompliment), wenn ich mal raten darf, wer hier der Lehrer war.

    P.S.: Oh Gott:

    cin.sync();    cin.clear();//keine ahnung wozu, im buch wurde das immer so gemacht.
    

    Das macht glaube ich nicht einmal Jürgen Würgen. Hoffe ich.

    @Nikolai: Dir will hier niemand was böses. Im Gegenteil, du willst Hilfe, wir wollen helfen. Dazu muss man aber auch sagen können, dass dein Code Mist ist und dass dies daran liegt, dass du Mist gelernt hast (nochmals bestätigt durch dieses grandiose Fundstück aus deinem Buch). Wie sonst solltest du erfahren, dass du umlernen musst, wenn du jemals weiter kommen möchtest?



  • Nikolai schrieb:

    das programm crasht einfach immer.
    kann man das irgendwie lösen?

    Zusätzlich zu dem, was die anderen eh schon geschrieben haben...
    Das muss nicht crashen. Das ist undefiniertes Verhalten. Es gibt keinen Fehler "auf ein nicht existierendes Objekt zugreifen". Es könnte zu einer access violation kommen. Muss es aber überhaupt nicht. Solche Fehler können jahrelang unbemerkt im Code bleiben. Solche Speicherfehler sind ganz übel. Das schlimmste was passieren kann, es wird irgendwo im Programm Speicher überschrieben, was später an einer ganz anderen Stelle zu einem Crash führt (oder einfach dazu, dass sich das Programm falsch verhält, was aber gar nicht auffällt). Nach solchen Fehlern kann man wochenlang suchen.



  • SeppJ schrieb:

    Kellerautomat schrieb:

    Verlink mal bitte deinen anderen Thread, bin zu faul zum suchen.

    Alle Beiträge von Nikolai anzeigen, FTW! Er meinst diesen Thread:
    http://www.c-plusplus.net/forum/305611

    500 Zeilen Code mit der Aufforderung "Ich habe zwar keine Frage, aber schaut trotzdem mal durch, ihr habt schließlich sonst nix zu tun". Kein Wunder, dass dort niemand geantwortet hat. Zu den Winapizeugs kann ich nix sagen, außer dass ich mir da einen Wrapper machen würde, anstatt so wild am C-Interface rumzufummeln, der Rest des Codes ist so typischer "C++ von A bis Z"-Stil (das ist kein Kompliment), wenn ich mal raten darf, wer hier der Lehrer war.

    P.S.: Oh Gott:

    cin.sync();    cin.clear();//keine ahnung wozu, im buch wurde das immer so gemacht.
    

    Das macht glaube ich nicht einmal Jürgen Würgen. Hoffe ich.

    @Nikolai: Dir will hier niemand was böses. Im Gegenteil, du willst Hilfe, wir wollen helfen. Dazu muss man aber auch sagen können, dass dein Code Mist ist und dass dies daran liegt, dass du Mist gelernt hast (nochmals bestätigt durch dieses grandiose Fundstück aus deinem Buch). Wie sonst solltest du erfahren, dass du umlernen musst, wenn du jemals weiter kommen möchtest?

    Ich keine Ahnung was cin.sync und clear bewirkt, aber ich konnte herausfinden, um welches Buch es sich handelt:
    C++ – Lernen und professionell anwenden

    (Hab ich bei Google gefunden und da war gleich das ganze Buch bei Google Books. Ist das überhaupt legal, dass Google Books ein ganzes Buch hat?)

    EDIT: War nur eine Leseprobe. Hier der Link zum Buch;
    http://books.google.at/books?id=yNlxgQAaXBcC&pg=PA587&lpg=PA587&dq=cin.sync();++++cin.clear();&source=bl&ots=DN9YWrvPFZ&sig=z0q9xN7BbSS3zB58cw3rcz3z4SA&hl=de&sa=X&ei=newKUOacDKPC0QWf1_DeCg&ved=0CIIBEOgBMAg#v=onepage&q=cin.sync()%3B cin.clear()%3B&f=false



  • @TE: Guck mal in deinen Thread. Ich glaub, ich hab dort einen Post verloren.



  • das ist der korrekte buchtitel. der name war wohl nicht programm, die bewertungen bei amazon waren jedenfalls gut, nur danach hab ichs ausgesucht.



  • Bewertungen von Fachbüchern für Anfänger sind nie zuverlässig. Diejenigen, die die Rezension schreiben, haben gerade ihr ganzes Wissen aus diesem Buch bezogen und können dessen Unzulänglichkeiten zwangsläufig nicht einschätzen.

    Es gibt wohl einige Implementationen, unter denen std::cin.sync() den Inhalt des Eingabepuffers wegwirft - vom Standard ist das natürlich nicht gedeckt, und was dabei genau passiert, ist mitunter gar nicht so einfach vorherzusagen (etwa, wenn der Eingabestrom umgeleitet wird, Dinge per copy/paste in die Konsole gepumpt werden oder jemand im ungünstigen Moment noch eine Taste drückt). Eine bessere Herangehensweise ist es üblicherweise, den Rest der eingegebenen Zeile zu ignorieren -- so lässt sich der Kram dann auch besser skripten. Das sieht dann beispielsweise so aus:

    std::cin.ignore(1000000, '\n'); // Ignoriere eine Million Zeichen oder bis zum nächsten '\n' (was früher kommt)
    

    Besser noch ist

    #include <iostream>
    #include <limits>
    
    ...
    
    std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    

    std::numeric_limitsstd::streamsize::max() ist der größte Wert, den std::streamsize annehmen kann. Im Standard ist dieser spezielle Aufruf von std::istream::ignore ein Sonderfall, durch den der erste Parameter quasi ignoriert wird (es wird bis zum nächsten Zeilenumbruch ignoriert, unabhängig davon, wie lange das dauert).

    Eine andere Herangehensweise ist, ganze Zeilen in einen std::string einzulesen und einen Stringstream zum Parsen heranzuziehen - das ist konzeptionell hübsch sauber, weil der Eingabestrom praktisch nie mit Resten zurückbleibt (ergo exceptionsicher), kann aber, wenn I/O-Performance kritisch ist, langsamer sein.

    Was Bücher angeht, so lohnt sich ein Gang zum Großmeister oder der etwas billigere Gang zu auch sehr fähigen Leuten. Letzterer Titel kommt allerdings vorrausichtlich bald in neuerer Auflage heraus und scheint im Moment (zumindest bei Amazon) nur auf Englisch zu kriegen zu sein. Wende dich halt an einen Buchhändler deines Vertrauens.



  • seldon schrieb:

    Bewertungen von Fachbüchern für Anfänger sind nie zuverlässig.

    Das ist leider nicht nur bei Fachbüchern so. Wenn ich mir Bewertungen zur Unterhaltungsliteratur anschaue, könnte man auch glatt meinen, das muss das einzige Buch sein, dass die Leute jeweils gelesen haben, sonst kann ich meist keinen Grund erkennen, warum das jemand gut findet. Deswegen lese ich bei Amazon grundsätzlich fast nur die negativen Kritiken.



  • Wahrscheinlich gibt es da einen psychologischen Effekt, dass nur diejenigen zurückgehen und sich die Mühe machen, eine Rezension zu schreiben, denen das Buch sehr gut gefallen hat. Und halt die, die dafür bezahlt werden.


Anmelden zum Antworten