char to string: Wie ich mir in den Fuß geschossen habe



  • @IBV: An den Warnungen wird gearbeitet, die sind in der Tat nicht immer einfach. Aber schau dir mal an was mit Clang alles auf uns für tolle Tools wartet, die selbst Sachen wie Stack-Overflow etc. in vielen Fällen erkennen. C++ ist auf einem sehr guten Weg in die Zukunft und noch nie ist soo viel drumherum in der Richtung passiert. Clang ist echt der Hammer und erlaubt IDEs in Zukunft dem Nutzer sehr viel Arbeit abzunehmen, auch was Sicherheit angeht.
    The Care and Feeding of C++'s Dragons



  • Ich kann mich dann doch nicht enthalten, darauf hinzuweisen, dass Javas String-Klasse einen Konstruktor, der einen einzelnen char entgegen nimmt, ebenfalls nicht hat.



  • @IBV
    "Ich kann damit nicht umgehen, also ist es Mist!".
    Hm....

    Nö.



  • Also dass C++ Compiler bei impliziten "narrowing conversions" nicht warnen ist schon ziemlich traurig.

    #include <cstdint>
    
    template <typename T>
    void foo(T&) {}
    
    int main()
    {
    	std::uint64_t i = 0x77777777;
    	std::uint16_t j = i;
    	foo(j);
    }
    

    Kompiliert mit Clang 3.4.1 und GCC 4.9 mit -std=c++11 -pedantic -Wall -Werror. VS gibt immerhin eine Warnung aus:

    warning C4244: 'initializing': conversion from 'uint64_t' to 'uint16_t', possible loss of data

    Genau so, wie es sein sollte. Aber wenn man i als std::uint32_t definiert verschwindet die Warnung auch bei VS - sogar bei /Wall.**

    Man kann mit -Wconversion kompilieren, dann bekommt man

    error: implicit conversion loses integer precision: 'std::uint64_t'

    Aber wer macht das schon? Bis ich das gerade eben ausprobiert habe, kannte ich diesen Compiler-Switch nicht mal. (Okay, ich benutze normalerweise nicht Clang/GCC, aber trotzdem.)

    Hat zwar mehr mit Compilern als mit der Sprache zu tun*, aber die größeren Compiler gehören dann ja doch auch irgendwie zur Sprache dazu in der Praxis.

    * Auch wenn's natürlich besser wäre wenn diese Konvertierungen implizit überhaupt nicht möglich wären, aber das hat man halt davon wenn man zu C kompatibel sein will. Man bekommt den ganzen Müll des schwachen Typsystems von C mit und wird es nie ordentlich fixen können.

    IBV schrieb:

    Ich kann C und Java ziemlich gut. C hatte ich 3 Semester lang intensiv im Studium mit Multithreading, POSIX-API, Consumer-Producer-Problem mit beliebigen, einstellbaren Threads, Linux-Treiber-Programmierung etc.
    Bei C, weiß ich was ich mache. Es macht mir keine falschen Versprechen. C++ tut genau das!

    Ironischerweise hat der Compiler dir bei deinem map-bug genau deshalb keine Fehlermeldung gegeben, weil C++ das Typsystem von C übernommen hat. Scheinst dich also in C vielleicht doch auch nicht ganz so gut zurecht zu finden, wie du denkst.

    **Edit: Ältere VS Versionen warnen da scheinbar noch, vielleicht wird das noch gefixt für VS 2015.



  • Bei Clang hat du den Static Analyser aber mit dabei. http://clang-analyzer.llvm.org/



  • IBV schrieb:

    @AlterJavaBaer: Ich kann C und Java ziemlich gut. C hatte ich 3 Semester lang intensiv im Studium mit Multithreading, POSIX-API, Consumer-Producer-Problem mit beliebigen, einstellbaren Threads, Linux-Treiber-Programmierung etc.
    Bei C, weiß ich was ich mache. Es macht mir keine falschen Versprechen. C++ tut genau das! Warum zum Teufel warnt mich der Compiler nicht, wenn ich etwas unerlaubtes mache? Wo der C++ Compiler bestenfalls ein Warning kackt, wäre das unter Java nicht nur nicht kompilierbar, sondern die IDE warnt einen schon im Voraus bevor man auf den Compile-Button drückt. Deswegen ist für mich C++ trotz C++14, immer noch Steinzeit.

    L. G.,
    IBV

    du kannst c ziemlich gut verstehst aber nicht warum char!=string ist?! das versteh ich nicht...
    vll sollte man sich wenn man eine sprache erlernen will mit den besonderheiten / eigenheiten beschäftigen...
    GCC warnt bei fehlendem return...! was für einen compiler nutzt du? da gibt es auch unterschiede...
    aber das hat auch so gesehen nicht direkt was mit der sprache zu tun... 🙄

    wenn java das genau so macht wie du willst warum lernst/programmierst du dann c++? 😃

    ich muss dir ganz ehrlich sagen das die probleme die du hast eher von grundlegenden verständnisproblemen zusammenhängen (in meinen augen) anstatt mit c++... und du kannst c?
    ich kann c zwar nicht hatte es aber nebenbei während der ausbildung so 2-3 jahre...
    ich hab mich aber immer mit c++ lieber befasst, deswegen kenne ich zwar nicht alles aber grundlegend sollte sich da nicht sooo viel unterscheiden?!

    wenn du c kannst solltest du auch verstehen warum es logisch ist das man einen char nicht in einen string kopieren kann... oder nicht? 😕
    wenn du nur java kannst...
    könnte ich ja noch nachvollziehen warum du soetwas nicht weißt ... aber selbst dann...

    na ja genug dazu, was ich eig aussagen wollte:
    c++ ist kein mist, genauso wie i.eine andere sprache...
    jede hat nur ihre speziellen stärken und schwächen... und wahrscheinlich ist es dann auch noch geschmackssache... 🙂

    und eine sprache ist kein mist weil du deinen compiler nicht auf -Wall gestellt hast oder sonst i.was nicht eingestellt oder verstellt hast...

    ich sag ja auch nicht java ist scheiße weil es dem programmierer die denkarbeit abnimmt... :p

    lg



  • Java ist Mist, das warnt mich nicht wenn der GC mir mein Timing zerschießt.



  • Hi,
    ähm, jo...
    Also, dass C++ Compiler erst mit clang einigermaßen an die Qualität von Java, rust etc. rankommen ist traurig, da C++ deutlich älter ist.

    Dass, C++ Compiler doch eine Warnung bei fehlendem return anzeigen, hatte ich hinterher geschrieben:

    IBV schrieb:

    Hm, ok. Das Problem war KDevelop. Wenn man auf "Ausführen" klickt, werden die Warnungen anscheinend nicht angezeigt. Wenn man nur auf "Erstellen" klickt, sieht man die Warnungen.

    Bei Java hätte das nicht nur nicht kompiliert, sondern die IDE hätte mich schon vor dem expliziten Compilieren gewarnt.

    Aber hier versagt Wall bei gcc (ich hatte zwischenzeitig von clang auf gcc gewechselt) und bei clang funktioniert das glücklicherweise:

    string code = "";
    code += dict[compound]; // dict ist map<string, int>
    

    Weshalb ich string und int ohne Konvertierung verknüpfe? Weil erstens C++ so etwas wie Operatoren-Überladung beherrscht und das theoretisch hätte gehen können, schließlich konnte ich ein char ebenfalls einen string zuweisen ohne explizite Konvertierung, was beim Konstruktor komischerweise nicht ging (Java ist hier konsequent, es geht beides nicht ohne explizite Konvertierung), zweitens ging ich davon aus, dass wenn ich Wall eingeschaltet habe, mich der Compiler (gcc) warnt. Beides traf nicht zu, deswegen kam ich mir vor wie in der Steinzeit.

    Weshalb ich C++ verwende? Weil ich es brauche. :p Im Studium und bei der Arbeit. Ich implementiere momentan sowas wie einen lzw-Codierer/Decodierer lieber in C++ als in MatLab, weil meine MatLab-Lizenz irgendwann ausläuft und falls ich mal Code gebrauchen könnte, müsste ich erst mal den Code portieren. C++ anstatt Java verwende ich hier zu Übungszwecken.

    Meine Lehre? clang verwenden, Wall, pedantic, Werror, C++ nicht kritisieren, weil C++ die beste Sprache der Welt ist. :p

    L. G.,
    IBV



  • IBV schrieb:

    Hi,
    ähm, jo...
    Also, dass C++ Compiler erst mit clang einigermaßen an die Qualität von Java, rust etc. rankommen ist traurig, da C++ deutlich älter ist.

    Dass, C++ Compiler doch eine Warnung bei fehlendem return anzeigen, hatte ich hinterher geschrieben:

    IBV schrieb:

    Hm, ok. Das Problem war KDevelop. Wenn man auf "Ausführen" klickt, werden die Warnungen anscheinend nicht angezeigt. Wenn man nur auf "Erstellen" klickt, sieht man die Warnungen.

    Bei Java hätte das nicht nur nicht kompiliert, sondern die IDE hätte mich schon vor dem expliziten Compilieren gewarnt.

    Aber hier versagt Wall bei gcc (ich hatte zwischenzeitig von clang auf gcc gewechselt) und bei clang funktioniert das glücklicherweise:

    string code = "";
    code += dict[compound]; // dict ist map<string, int>
    

    Weshalb ich string und int ohne Konvertierung verknüpfe? Weil erstens C++ so etwas wie Operatoren-Überladung beherrscht und das theoretisch hätte gehen können, schließlich konnte ich ein char ebenfalls einen string zuweisen ohne explizite Konvertierung, was beim Konstruktor komischerweise nicht ging (Java ist hier konsequent, es geht beides nicht ohne explizite Konvertierung), zweitens ging ich davon aus, dass wenn ich Wall eingeschaltet habe, mich der Compiler (gcc) warnt. Beides traf nicht zu, deswegen kam ich mir vor wie in der Steinzeit.

    Weshalb ich C++ verwende? Weil ich es brauche. :p Im Studium und bei der Arbeit. Ich implementiere momentan sowas wie einen lzw-Codierer/Decodierer lieber in C++ als in MatLab, weil meine MatLab-Lizenz irgendwann ausläuft und falls ich mal Code gebrauchen könnte, müsste ich erst mal den Code portieren. C++ anstatt Java verwende ich hier zu Übungszwecken.

    Meine Lehre? clang verwenden, Wall, pedantic, Werror, C++ nicht kritisieren, weil C++ die beste Sprache der Welt ist. :p

    L. G.,
    IBV

    was meinst du mit "qualität" ? bezogen auf was ? 🙄

    jop sry das hatte ich nicht gesehen, aber auch der gcc wirft bei mir eine warnung wenn return fehlt... welche version nutzt du? (die aktuellste?)

    na ja was ist denn explizites compilieren und was wäre dann nicht explizites compilieren? 😃
    bei mir wirft der gcc auch "bei/bzw. vor dem compilieren" eine warnung...

    kDevelop kenn ich nicht... kann ich nix zu sagen...
    bei mir wirft der gcc fehlermeldungen, wenn ich fehler mache, abgesehen von denen wo das zu erwarten wäre(z.B. logikfehler)...

    wie meinst du c++ beherrscht den operatoren-überlauf?

    kann sein das es passt mit den datentypen... kann halt auch schief gehen , dann hast du ein undefiniertes und sehr schwer zu findendes problem 😉 ... (würde ich in c++ vermeiden ohne typen sicherheit zu arbeiten vorallem wenn du string einer int zuweißt... musst du aber letztendlich alleine wissen ... )
    aber soweit ich weiß sind int und string kein kompatiblen datentypen...
    da sollte man auch aufpassen denn so entstehen leicht sehr schwer zu findende fehler...
    (eig gibt es extra stringfunktionen um strings in int zu wandeln und umgekehrt...)

    und char und string ist nicht das selbe... (sonst hieß es gleich 😉 )
    string ist sogar ein dynamischer datentyp...
    wenn du den in ein char schreibst mit fester größe besteht hier das risko eines speicherüberlaufes... 🙄 (außer du überprüfst vorher nochmal deinen string, oder die länge ist klar... 😉 )

    kritik ist immer was positives 🙂 ...
    sie wird ja ausgeübt um verbesserungen ans licht zu bringen 😉 ...



  • edit:
    ich meinte Operatoren-ÜBERLADUNG nicht überlauf...
    sry hab mich verschrieben...



  • MfG, ich werde mir die Mühe machen, dir einmal zu antworten. In Zukunft werde ich das nicht mehr tun, weil deine Ahnungslosigkeit (ich bin es auch, aber nicht sooo) ziemlich anstrengend ist und du implizit gegenteiliges behauptest.

    Was ich mit Qualität der Compiler meine: Dass eben schon viele Fehler vorweg vermieden werden. D. h., Fehler werden zuverlässig erkannt und sind erst gar nicht kompilierbar. Logikfehler meine ich damit natürlich nicht.

    Explizites Compilieren: Wenn du auf den Run-Button drückst. Implizites Compilieren: Es geschieht im Hintergrund. Java-IDEs machen das, sobald du eine Java-Datei speicherst.

    gcc-Version: 4.8

    Du weißt nicht, was Operatoren-Überladung ist? Das erlaubt z. B., dass ich Schokolade und Autoreifen verheirate. Das macht in dem Fall vll. nicht viel Sinn, aber bei char und string schon. Wie gesagt: string macht genau das beim Zuweisungsoperator:

    char c = 'a';
    string b;
    b = c; // Funkioniert, weil hier der Operator = von string überladen wurde!
    

    http://www.cplusplus.com/reference/string/string/operator=/
    Man könnte theoretisch auch folgenden Operator definieren:

    string& operator= (int i);
    

    Und intern wird ein to_string() angewendet. Genau das hatte ich vermutet, weil gcc keine Warnung ausgab.

    Hoffe, du hast nun ein paar Fragezeichen weniger im Kopf.

    L. G.,
    IBV



  • IBV schrieb:

    MfG, ich werde mir die Mühe machen, dir einmal zu antworten. In Zukunft werde ich das nicht mehr tun, weil deine Ahnungslosigkeit (ich bin es auch, aber nicht sooo) ziemlich anstrengend ist und du implizit gegenteiliges behauptest.

    Was ich mit Qualität der Compiler meine: Dass eben schon viele Fehler vorweg vermieden werden. D. h., Fehler werden zuverlässig erkannt und sind erst gar nicht kompilierbar. Logikfehler meine ich damit natürlich nicht.

    Explizites Compilieren: Wenn du auf den Run-Button drückst. Implizites Compilieren: Es geschieht im Hintergrund. Java-IDEs machen das, sobald du eine Java-Datei speicherst.

    gcc-Version: 4.8

    Du weißt nicht, was Operatoren-Überladung ist? Das erlaubt z. B., dass ich Schokolade und Autoreifen verheirate. Das macht in dem Fall vll. nicht viel Sinn, aber bei char und string schon. Wie gesagt: string macht genau das beim Zuweisungsoperator:

    char c = 'a';
    string b;
    b = c; // Funkioniert, weil hier der Operator = von string überladen wurde!
    

    http://www.cplusplus.com/reference/string/string/operator=/
    Man könnte theoretisch auch folgenden Operator definieren:

    string& operator= (int i);
    

    Und intern wird ein to_string() angewendet. Genau das hatte ich vermutet, weil gcc keine Warnung ausgab.

    Hoffe, du hast nun ein paar Fragezeichen weniger im Kopf.

    L. G.,
    IBV

    wie du meinst... 🙂
    ahnungslosigkeit? wie kommst du darauf? nur weil ich mal nachgefragt hatte?
    eine frage ist kein zeichen für ahnungslosigkeit... (soweit ich weiß...)
    dann werde ich dich auch nicht weiter beanspruchen, nicht das es noch anstrengender wird 😃 ...

    ok compiler-qualität hätte mir schon gereicht...
    war mir nicht ganz sicher was du meinst...

    expliziertes compilieren kenne ich nicht...
    ich mache auch kein java...
    bitte um verzeihung ich wollte in diesem zusammenhang eig einfach was dazu lernen... 🙄

    ich weiß was operatoren-überladung ist 😉 ...
    gibt hier im forum auch ne schöne mehr teilige erklärung dazu 😉 ...

    ps. c++ ist aber kein "mist" .. auch wenn es manchmal probleme macht bzw. verständnis vorraussetzt... was java nicht macht 😉 ...

    das wars von mir, dann schön abend noch...



  • @ IBV hast du vll mal einen link oder sowas zu diesem "explizierten" kompilieren...
    ich kann dazu nix finden... 😮
    würde mich mal interessieren wie das funktioniert... (eig das nicht explizite speziell...) 🙄

    lg



  • Because of the IDE's Compile on Save feature, you do not have to manually compile your project in order to run it in the IDE. When you save a Java source file, the IDE automatically compiles it.

    https://netbeans.org/kb/docs/java/quickstart.html

    When you save a Java file, Eclipse will automatically compile the file also, so that you don't need to compile it later when you want to run it.

    http://oak.cs.ucla.edu/cs144/projects/eclipse/windows.html



  • IBV schrieb:

    Because of the IDE's Compile on Save feature, you do not have to manually compile your project in order to run it in the IDE. When you save a Java source file, the IDE automatically compiles it.

    https://netbeans.org/kb/docs/java/quickstart.html

    When you save a Java file, Eclipse will automatically compile the file also, so that you don't need to compile it later when you want to run it.

    http://oak.cs.ucla.edu/cs144/projects/eclipse/windows.html

    vielen dank 🙂 ...
    schönen abend noch, sry falls ich i.wie genervt habe, war nicht meine absicht, wollte was lernen und evt. helfen.
    lg MfG



  • IBV schrieb:

    Also, dass C++ Compiler erst mit clang einigermaßen an die Qualität von Java, rust etc. rankommen ist traurig, da C++ deutlich älter ist.

    Dir ist aber schon klar, daß der C++-Standard um einiges komplexer ist als deine Gegenbeispiele?



  • @Mfg: Mich hat vor allem gestört, dass jemand, der noch weniger Ahnung hat als ich, mir Ahnungslosigkeit vorgeworfen hat und als ich mich erklärte, hast du alte Punkte, die ich eigentlich schon aufgeklärt hatte, wiederholt bzw. hast um den heißen Brei geredet (ohne konstruktives Ergebnis). Genau das macht die Sache anstrengend.

    Btw: Man kann in Java auch nicht ohne tiefes Verständnis gut programmieren und der GC ist in den meisten Fällen kein Problem, sondern Problemlöser.

    Btw2: Eine neue Version von Chrome wurde released:

    [$1500][406868] High CVE-2014-7900: Use-after-free in pdfium. Credit to Atte Kettunen from OUSPG.
    [$1000][414504] High CVE-2014-7902: Use-after-free in pdfium. Credit to cloudfuzzer.
    [$3000][414525] High CVE-2014-7903: Buffer overflow in pdfium. Credit to cloudfuzzer.
    [$2000][418161] High CVE-2014-7904: Buffer overflow in Skia. Credit to Atte Kettunen from OUSPG.
    [$500][423030] High CVE-2014-7906: Use-after-free in pepper plugins. Credit to Chen Zhang (demi6od) of the NSFOCUS Security Team.
    [$7500][423703] High CVE-2014-0574: Double-free in Flash. Credit to biloulehibou.
    [$5000][424453] High CVE-2014-7907: Use-after-free in blink. Credit to Chen Zhang (demi6od) of the NSFOCUS Security Team.
    [$500][391001] Medium CVE-2014-7909: Uninitialized memory read in Skia. Credit to miaubiz.

    http://googlechromereleases.blogspot.de/2014/11/stable-channel-update_18.html

    Nein, ich will damit nicht sagen, dass es eine gute Idee ist in Java einen Browser zu schreiben, sondern, dass immer noch Menschen programmieren und egal wie gut du bist, du wirst immer klassische Fehler machen und wenn sie bei dir selten vorkommen, bist du entweder tatsächlich verdammt gut oder deine Programmieranforderungen provozieren obige Fehler nicht.

    Swordfish schrieb:

    Dir ist aber schon klar, daß der C++-Standard um einiges komplexer ist als deine Gegenbeispiele?

    Was willst du damit sagen? Spricht das für C++ oder dagegen?
    C++ ist teilweise zu recht komplex, weil mächtiger, teilweise ist es aber auch komplexer als es eigentlich nötig wäre, das spricht wiederum gegen C++.

    L. G.,
    IBV



  • Eine C++ IDE kann viele Fehler doch gar nicht anzeigen, da zu dem Zeitpunkt des Eingabe und Speichern nicht kompiliert wird, da ist keine VM im Hintergrund mit JIT. Um sowas zu können müsste IDE am laufenden Band kompilieren und einen vollständigen C++-Compiler eingebaut haben.

    Da vergisst, dass C++ eine echte native Programmiersprache ist. Du programmiert da wirklich dein OS und die CPU etc. mit und nicht nur eine weichgespülte VM mit Zufalls-GC und keiner echten Ressourcenverwaltung, da RAII nicht wirklich konsequent unterstützt werden kann.

    C++ ist halt LEGO für Erwachsene, da kann ein Kind schon mal überfordert sein und es in die Ecke schmeißen.



  • @ThinkAboutIt: Jede Wette, dass du auch so ein Kandidat mit wenig Ahnung bist! Du hast meine Kritikpunkte nicht mal im Ansatz verstanden!



  • IBV schrieb:

    Swordfish schrieb:

    Dir ist aber schon klar, daß der C++-Standard um einiges komplexer ist als deine Gegenbeispiele?

    Was willst du damit sagen? Spricht das für C++ oder dagegen?
    C++ ist teilweise zu recht komplex, weil mächtiger, teilweise ist es aber auch komplexer als es eigentlich nötig wäre, das spricht wiederum gegen C++.

    Komplexität spricht so ohne weiteres weder dafür noch dagegen. Es ist so. Lern bitte argumentieren.


Anmelden zum Antworten