C-Strings vergleichen



  • $ g++ test.cc
    test.cc:1:22: schwerwiegender Fehler: iostream.h: Datei oder Verzeichnis nicht gefunden
    Kompilierung beendet.
    

    Ein Semikolon nach Funktionskörpern wird von den meisten Compilern geschluckt, das ist richtig, aber die Grammatik, wie sie im Standard beschrieben wird, gibt es eigentlich nicht her.

    Relevante Teile der Grammatik:

    function-definition:
      decl-specifier-seq[t]opt[/t] declarator ctor-initializer[t]opt[/t] function-body
      decl-specifier-seq[t]opt[/t] declarator function-try-block
    
    function-body:
      compound-statement
    
    function-try-block:
      try ctor-initializer[t]opt[/t] function-body handler-seq
    
    handler-seq:
      handler handler-seq[t]opt[/t]
    
    handler:
      catch ( exception-declaration ) compound-statement
    
    compound-statement:
      { statement-seqopt }
    

    Bemerke, dass compound-statement durch eine geschweifte Klammer und kein Semikolon beendet wird.



  • seldon schrieb:

    Geldbeträge sind meistens am sinnvollsten in Cent mit großen Integertypen berechnet (etwa std::tr1::int64_t).

    Es hat sich eigentlich eingebürgert dass man mit Faktor 10000 arbeitet. Es gibt einfach zu viele Währungen die nicht Faktor 100 für die Unterwährung verwenden, sondern Faktor 1000 oder auch mal 2000.



  • In dem Buch sind n paar Syntaxfehler drin aber es ist nicht überhäuft. Außerdem könnt ihr froh sein, dass es das Buch gibt, denn sonst könnte das Forum ja fast zu machen 😃 😃 😃 .
    Ich bin jetzt auch bei Strings in dem Buch angekommen und werd es auch weiterlesen, da ich dafür ja gezahlt habe.


  • Mod

    HKEY schrieb:

    In dem Buch sind n paar Syntaxfehler drin aber es ist nicht überhäuft.

    Die Syntaxfehler sind nicht das entscheidende. Sie sind nur selbst für Anfänger offensichtliche Symptome für mangelnde Sorgfalt. Das eigentliche Problem sind falsche Konzepte, fehleranfälliger Programmierstil und schlicht und einfach Fehlinformationen. Diese Dinge kann man natürlich als Anfänger nicht beurteilen, daher halten sie das Buch fälschlicherweise für gut, weil J.W. in einem schönen Deutsch schreibt.
    Wenn du die offensichtlichen Fehler ignorierst und auch den fortgeschrittenen Forenteilnehmern nicht glaubst, dass diese nicht die einzigen Fehler sind, dann ist dir nicht zu helfen. Wir sehen uns dann in ein paar Wochen, wenn du das erste Mal ernsthafte Schwierigkeiten bekommst, wegen dem Schrott den du dir jetzt selbst eintrichtern willst. Und dann wird es wieder heißen "Haha, ein neues Opfer.", "Vergiss alles was in dem Buch stand!" und "Kauf dir den C++ Primer!" und die Enttäuschung wird groß sein, dass der Kutschenführerschein den man gemacht hat, nichts für die Autobahn taugt. Betrachte dich als gewarnt.



  • Naja, dass ich nicht beurteilen kann, ob das Buch gröbere Fehlinformationen vermittelt, das stimmt. Ich bin nun mal Anfänger.

    Doch eine Sache : Dieses Buch vermittelt doch so und so nur die Grundlagen von C++ ? Es werden keine komplexeren Vorgänge beschrieben, oder ähnliches ( Na gut, vllt. die GUI-Programmierung am Ende, da bin ich aber 1.) nocht nicht und 2.) werden da auch wohl kaum gröbere Fehler sein).
    Ob er bei dem typcasting-Kapitel irgendwas falsch erzählt weiß ich tatsächlich nicht, aber selbst wenn wäre es wohl nicht allzu schlimm. Wenn man merkt, dass irgendwas nicht klaptt,schaut man in einer 2.-Quelle nach oder fragt Bekannte.

    Generell kannte ich Galileo-Computing als seriösen Buchverlag, der wirklich gute Bücher rausbrachte.



  • Damit du in andere Quellen schaust, musst du aber erst mal merken, dass etwas falsch ist. Das ist aber nur bei einfachen Fehlern wie Syntaxfehlern zu schaffen. Wenn ich an sowas denke wie "goto ist verpönt, weil es der Performance schadet: Der Programmablauf wird an der Stelle unterbrochen -> lahm", dann denke ich nur WTF und du glaubst es ihm, wenn du es nicht besser weißt.

    Ich verstehe einfach nicht, warum du etwas Falsches lernen willst? Nur weil du da ein paar Euro reingesteckt hast? Verkauf das Buch.



  • Hmm das stimmt. Ich meinte nicht direkt Syntaxfehler, sondern wenn du ein Programm schreibst und du merkst, dass es nicht so läuft wie du dir das Vorgestellt hast, obwohl du alles beachtet hast. Aber das kostet unnötige Mühe, das stimmt wiederum auch.

    Btw: Wieso ist goto schlecht ? Soweit ich weiß, weil es Spagetthi-Code erzeugt und somit dem Code extrem unübersichtlich macht. Schließlich schreibt man Codes nicht für sich selber ( meistens nicht) sondern für andere, die evtl. später das Ganze verbessern müssen.

    Das Buch verkaufe ich nicht. Mir die Mühe nicht wert .
    Hatte es damals wie gesagt gekauft, wegen 1.) Guter Ruf des Verlages
    2.) Guten Kundenrezesionen bei Amazon

    Anderseits wird mir immer wieder gesagt, dass Bücher eh nichts taugen, sondern man soll lieber sich irgendein Programm vornehmen und das mit Hilfe von MSDN bzw. Google umsetzen. Wer weiß ...



  • Felixxx schrieb:

    Hmm das stimmt. Ich meinte nicht direkt Syntaxfehler, sondern wenn du ein Programm schreibst und du merkst, dass es nicht so läuft wie du dir das Vorgestellt hast, obwohl du alles beachtet hast. Aber das kostet unnötige Mühe, das stimmt wiederum auch.

    Selbst wenn etwas bei dir läuft, kann der Code immer noch undefiniertes Verhalten haben (das haben Quellcodes aus dem Buch übrigens auch) und irgendwann oder vielleicht mit nem anderen Compiler oder vielleicht auch nur bei Vollmond kackt dir alles ab.

    Aber ich seh schon, dass du dich von deinem Vorhaben nicht abbringen lässt. Dann viel Spaß.



  • Das siehst du falsch. Ich hatte so und so wohl nicht vor, das Buch weiter zu lesen. Das liegt daran, dass ich einfach keine Lust mehr habe, weiter an der Konsolo zu proggen um am Ende etwas zu erhalten, womit ich _nichts_ anfangen kann.
    Die übermäßige Kritik an dem Buch verrstärkt den Entschluss nurnoch.

    Dennoch muss ich wohl mind. darüber disktuieren, dass das Buch wirklich _so_ scheisse sein soll. Denn schlecht fand ich es nicht.

    Fändest du es besser wenn hier jeder bedingungslos akzeptieren würde, was ihm gesagt wird ? Ich nicht und ich bin auch nicht der Typ Mensch, der so reagiert ( was Euch sicher schon aufgefallen ist).



  • Felixxx schrieb:

    Dennoch muss ich wohl mind. darüber disktuieren, dass das Buch wirklich _so_ scheisse sein soll. Denn schlecht fand ich es nicht.
    Fändest du es besser wenn hier jeder bedingungslos akzeptieren würde, was ihm gesagt wird?

    Paßt gut zusammen. Wenn Du eh bei jeder Seite zweifelst, kann ein Buch auch drei Fehler pro Seite haben, ohne daß es Dir schaden würde.



  • Joa ^^ Dass deine Meinung Fakt ist bzw. sein muss habe ich auch schon bemerkt 😉



  • Felixxx schrieb:

    Dennoch muss ich wohl mind. darüber disktuieren, dass das Buch wirklich _so_ scheisse sein soll. Denn schlecht fand ich es nicht.

    als ob du das beurteilen könntest...
    du kanntest C++ davor gar nicht und willst es mit diesem buch lernen. das, was du jetzt gelernt hast, ist ein C/C++ Mischmasch - was man aber als Anfänger einfach nicht merken wird.
    Allein schon, wenn in einem C++ Buch bevor auf std::string eingegangen wird, char[willkrüliche_zahl] für strings genutzt wird, hat es 2 Zeichen zu viel im Titel. Da hilft auch ein printf-ersetzen durch cout nicht...
    Klar wirst du jetzt sagen, "ich sollte doch aber wissen, wie xyz intern funktioniert, wenn ich es verwende" - ist aber kein argument bei programmier(-hoch)-sprachen. dann müsstest du wohl zu allererst asm lernen. oder bei der cpu-architektur anfangen - oder noch weiter unten...

    bb



  • Löl.
    Ich kann und will das einfach nicht als Argument gegen ein Buch akzeptieren. Egal welches Buch.
    Wenn du ein Haus baust, fängst du dann mit dem Dach an ? Wohl kaum.

    C-String gehören genauso zu C wie zu C++, also kann man schlecht von einem Mischmasch aus beiden Sprachen reden. Natürlich stammen C-String aus C, aber man benutzt sie trotzdem sehr häufig in C++. Also macht es Sinn, darauf einzugehen.
    Außerdem geht er beim Erwähnen der String-Klasse direkt ganz darauf ein. Sollte er das etwa gleich bei den Basisdatentypen int, char, etc. machen ? Wohl kaum ...

    Und nun erklär mir bitte noch, wie das das Vertändnis eines Programmieranfängers durcheinander bringt ? Die Tatsache, dass der Autor vor Strings auf C-String eingeht ?


  • Administrator

    Felixxx schrieb:

    Und nun erklär mir bitte noch, wie das das Vertändnis eines Programmieranfängers durcheinander bringt ? Die Tatsache, dass der Autor vor Strings auf C-String eingeht ?

    Ich zeige es dir an deinem eigenen Beitrag auf.

    Felixxx schrieb:

    C-String gehören genauso zu C wie zu C++, also kann man schlecht von einem Mischmasch aus beiden Sprachen reden. Natürlich stammen C-String aus C, aber man benutzt sie trotzdem sehr häufig in C++. Also macht es Sinn, darauf einzugehen.

    Das stimmt nicht. Ich benutze grundsätzlich gar nie mehr C Strings, schon nur deshalb weil sie nicht RAII Konform sind. Die Funktionen aus dem <cstring> Header benutze ich überhaupt nie.

    In C++ wirst du in erster Linie std::string oder std::vector verwenden. Du wirst nur in seltenen Ausnahmen auf C-Strings oder C-Arrays ausweichen.
    Wie ein std::string intern funktioniert gehört daher ans Ende des Buches. Es sollte erst dann erwähnt werden, wenn der Anfänger normalerweise für eine Aufgabe zuerst std::string nimmt.

    Grüssli


  • Mod

    Felixxx schrieb:

    Löl.

    Hör lieber auf unskilled, er weiß wovon er spricht.

    Wenn du ein Haus baust, fängst du dann mit dem Dach an ? Wohl kaum.

    Unpassender Vergleich. Besser wäre: Wenn du ein Haus baust, fängst du dann auch damit an, zuerst eine Strohhütte zu bauen?

    C-String gehören genauso zu C wie zu C++,

    Unsinn. Es gibt sie, aber sie gehören nicht wirklich dazu. Wenn J.W. bei dir einen anderen Eindruck erweckt hat, dann ist dies genau eine der Sachen auf die sich diese Kritik bezieht.

    warum dies Unsinn ist, erkläre ich unten.

    also kann man schlecht von einem Mischmasch aus beiden Sprachen reden.

    Doch. C-Strings benutzt man in C sehr oft, in C++ nie (zumindest nie so, dass man es merkt), daher ist es Sprachmischmasch sie in C++ zu benutzen.

    Natürlich stammen C-String aus C, aber man benutzt sie trotzdem sehr häufig in C++.

    Dies ist ganz einfach ein falscher Fakt. In C++ benutzt man C-Strings für 3 Sachen: Im Sinne von Stringliteralen um damit std::strings zu initialisieren. Im diesem Falle merkt man nichts von der C-String Natur. Zweitens bei der Übergabe von Kommandozeilenargumenten an main. Dies ist ein nerviges Überbleibsel aus alten Zeiten, dass nicht geändert werden kann. Üblicherweise wird daher sofort ein String mit diesen Werten initialisiert. Drittens um bestimmte Funktionen damit aufzurufen, die C-Strings haben müssen. Hier reicht ein c_str(), von dem man wissen muss, dass man es braucht, aber nicht was es macht. In allen Fällen muss man nicht wissen, was ein C-String ist, man bekommt idealerweise nicht einmal mit, was da passiert.

    Also macht es Sinn, darauf einzugehen.

    Ja, als kleiner Exkurs im Anhang für Interessierte.

    Und nun erklär mir bitte noch, wie das das Vertändnis eines Programmieranfängers durcheinander bringt ? Die Tatsache, dass der Autor vor Strings auf C-String eingeht ?

    Du selbst, und auch die vielen anderen Opfer hier im Forum, lieferst genügend Stoff für Argumente. Alleine schon die Tatsache, dass du C-Strings als normalen Teil von C++ ansiehst ist für einen C++-Programmierer eher amüsant. Aber du siehst dies natürlich gar nicht ein, weil dies in deinem Buch anders steht und dies ist alles was du kennst.

    Die einzige Wahl die du hast, ist dich zu entscheiden wem du glaubst: Jemandem der am laufenden Band Anfängerbücher zu verschiedensten Themen raushaut (wie gut wird er wohl recherchiert haben?) und dabei sogar Fehler macht die für Anfänger offensichtlich sind (die Syntaxfehler) oder der geballten Meinung aller regelmäßigen Teilnehmer im größten deutschen C++-Forum.

    Ich möchte dich jedoch auch noch darauf aufmerksam machen, dass Menschen bekanntermaßen ihre vergangenen Fehlentscheidungen gutreden und neue Fehlentscheidungen damit rechtfertigen: Ich habe jetzt schon tausende von Euros in die Reperatur meines Wagens gesteckt, weil ich mir damals eine Schrottmühle gekauft habe, jetzt kann ich auch nochmal 1000€ reinstecken, um durch den TÜV zu kommen. Ich habe jetzt schon 40 Euro für ein Buch ausgegeben welches mir schaden soll, jetzt kann ich es wenigstens durchlesen.



  • Ja, ich weiß dass ihr wisst, wovon Ihr sprecht.

    Aber ich denke es ist doch mal Geschmackssache, ob man std::string oder char array[50] verwendet.

    Außerdem übersiehst du eine Sache für die es gut sein könnte, es zu wissen :

    Deine C-Strings liegen immernoch im speicher und werden sogar verdopelt wenn du nen std::string damit initialiesiert. Das sollte man zumindest wissen um Schpeicherlecks zu vermindern. Oder sehe ich das falsch ?

    Btw: Die Sache mit dem Geld : Es geht mir nicht ums Geld. Wie schon öfter erwähnt habe ich garnicht vor das Buch weiterzulesen. Aber aus anderen Gründen. Die geballte Kritik verstärkt den Entschluss nurnoch.
    Aber ich fand das Buch bis dato not bad.



  • Felixxx schrieb:

    Aber ich denke es ist doch mal Geschmackssache, ob man std::string oder char array[50] verwendet.

    Ist es denn auch Geschmackssache, ob man ein sicheres oder unsicheres Rennauto fährt?

    Wenn man schon auf std::string verzichtet, dann kann man auch gleich in C programmieren. Denn das was std::string bietet macht C++ aus; wer sich dagegen wehrt, der wehrt sich gegen die Sprache an sich.


  • Mod

    Felixxx schrieb:

    Aber ich denke es ist doch mal Geschmackssache, ob man std::string oder char array[50] verwendet.

    Eben nicht. Das eine ist narrensicher, das andere ist fehleranfällig. Das eine ist kurz und elegant, das andere ist umständlich (es gibt ein paar Situationen in denen C-Strings kürzer und elganter sein können, aber dies ist eher die Ausnahme). Das eine ist vom Stil her konsistent zum Rest der Sprache, das andere nicht. Das eine ist etwas mit denen andere C++ Programmierer sich bestens auskennen, das andere nicht. Das eine hat eine intuitive Semantik (überladene Operatoren), das andere nicht. Beim einen wird alles automatisch für einen gemacht, beim anderen muss man selber auf alles aufpassen (und wehe man macht etwas falsch!). Beim einen hat man ohne Kosten die Flexibilität etwas ganz anderes zu machen (wusstest du zum Beispiel, dass man Strings mit int als Basis (anstatt char) haben kann? Das geht sogar mit eigenen Datentypen. Und man kann trotzdem alles so benutzen wie einen normalen std::string), beim anderen nicht.

    Deine C-Strings liegen immernoch im speicher und werden sogar verdopelt wenn du nen std::string damit initialiesiert. Das sollte man zumindest wissen um Schpeicherlecks zu vermindern. Oder sehe ich das falsch ?

    Das siehst du falsch. Wo du das her hast, kann man sich ja denken 😃



  • Hmm true.

    Aber :

    Für mich macht es immernoch Sinn bzw. ist es nicht schlimm, auf C-Strings in einem Buch vor std::string einzugehen. Ich möchte nicht nomal wiederholen warum ich denke, dass er das so macht ( auf string äher eingehen ... ) und es so auch durchaus Sinn macht.
    Außerdem :
    C ist Basis von C++.
    Es ist also nicht grausam und programmier-schadend C-Strings als eine Alternative zu std::string zu halten.



  • Das sehe ich falsch ? Was sehe ich falsch ?

    Und du hast recht, was die Verwendung von string in komplexen Programmen betrifft, in dem man sehr viel damit rumhantiert.
    Aber in Programmen, wo sie eher eine kleine Rolle spielen, kann man ruhig C-String nehmen, da schneller.


Anmelden zum Antworten