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



  • Gott zum Gruße!

    Folgendes funktioniert ohne Probleme:

    string a = "abc";
      string c;
    
      for ( int i = 0; i < a.length(); ++i ) {
          c = a[i];
      }
    

    Das hier, macht Probleme:

    string a = "abc";
    
      for ( int i = 0; i < a.length(); ++i ) {
          string c = a[i];
      }
    

    error: no viable conversion from 'char' to 'string' (aka 'basic_string<char>')

    --> Why?! Man kann das sicherlich technisch erklären, aber ist das nicht verdammt unintuitiv?!

    L. G.,
    IBV



  • es gibt anscheinend kein Konstruktor, der char nimmt, aber einen Zuweisungsoperator der das tut.

    EDIT: kurz geprüft.

    Ja, man könnte nun sagen, dass der Konstruktor für den char fehlt (explict ofc!).
    Oder man könnte argumentieren, dass ein char noch keinen string macht.

    Hier ist das jetzt halbe halbe 😕



  • Jesus Christ! Wann kommt C++ eigentlich im 21. Jahrhundert an?! 😡

    Ich habe gerade eben mind. 15 Minuten lang einen Bug gesucht: Mein Programm ist einfach abgestürzt. Der Fehler lag einfach daran, dass ich vergessen hatte bei einer Funktion einen return einzufügen. Trotz "Wall" hat mich clang(!) nicht gewarnt!

    L. G.,
    IBV



  • IBV schrieb:

    Jesus Christ! Wann kommt C++ eigentlich im 21. Jahrhundert an?! 😡

    Ich habe gerade eben mind. 15 Minuten lang einen Bug gesucht: Mein Programm ist einfach abgestürzt. Der Fehler lag einfach daran, dass ich vergessen hatte bei einer Funktion einen return einzufügen. Trotz "Wall" hat mich clang(!) nicht gewarnt!

    L. G.,
    IBV

    Das Problem hatte ich auch schon. Visual Studio bricht hier mit einem Fehler ab (non-standard behaviour)!
    Das ist sehr nasty ohne Warnung, da vermutlich nichts auf den Stack gepusht wird ohne return, und dadurch das Programm einfach den Bach runtergeht.

    EDIT: kurzer Test: g++ 4.9.2 [Wreturn-type] wird gewarnt. Missing return.

    EDIT: woah mobiler hotspot ist laaaahm :|



  • 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.



  • Erledigt.



  • kompilier halt mit -Werror



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

    Kompiliert ohne Warnungen, gibt mir aber kryptische Zeichen aus. Fehler: Es wurde vergessen von int nach string zu konvertieren.
    C++ ist einfach Mist...

    L. G.,
    IBV



  • IBV schrieb:

    C++ ist einfach Mist...

    Dann benutz es doch einfach nicht.



  • volkard schrieb:

    IBV schrieb:

    C++ ist einfach Mist...

    Dann benutz es doch einfach nicht.

    Aber nur, wenn jeder mitmacht. Dann brauch ich es nämlich auch nicht. 🙂 Bist du dabei?



  • IBV schrieb:

    Bist du dabei?

    Nö, ich hab diese Probleme echt nicht. 8 Wochen.



  • Tim06TR schrieb:

    Das Problem hatte ich auch schon. Visual Studio bricht hier mit einem Fehler ab (non-standard behaviour)!
    Das ist sehr nasty ohne Warnung, da vermutlich nichts auf den Stack gepusht wird ohne return, und dadurch das Programm einfach den Bach runtergeht.
    |

    Hi,

    also ich bin mir nicht ganz sicher was du fuer calling conventions benutzt, aber alle ich die kenne schieben das Ergebnis in EAX[:EDX].

    Gruessle



  • volkard schrieb:

    IBV schrieb:

    Bist du dabei?

    Nö, ich hab diese Probleme echt nicht. 8 Wochen.

    8 Wochen? 🙂



  • IBV schrieb:

    volkard schrieb:

    IBV schrieb:

    Bist du dabei?

    Nö, ich hab diese Probleme echt nicht. 8 Wochen.

    8 Wochen? 🙂

    volkard bezieht sich auf einen anderen thread, der aktuell im echten Leben Unterforum aktiv ist.

    Dort wird diskutiert ob die Lines of Code pro Tag ein sinnvolles Kriterium ist die Güte eines Programmierers zu messen.

    Und wie es so oft in diesem Forum ist, schweift das Thema ab und es wird diskutiert(findsch gut :>). Unter anderen hat ein anderer Kollege erzählt, dass er mal 8 Wochen Vollzeit an einem Bug gehangen hat.

    Ich würde es mal so interpretieren, dass volkard deine 15 Minuten für Kindergarten hält...

    Und wir kennen ja alle den Spruch von Bjarne: Mit C ist es leicht sich selbst in den Fuß zu schießen. Mit C++ ist das wesentlich schwieriger, aber.....



  • Sorry IBV, aber Deine Probleme ... blind und Krückstock und so ...



  • stuxn schrieb:

    Hi,

    also ich bin mir nicht ganz sicher was du fuer calling conventions benutzt, aber alle ich die kenne schieben das Ergebnis in EAX[:EDX].

    Gruessle

    war natürlich unsinn [thx for correction]



  • IBV schrieb:

    C++ ist einfach Mist...

    Wenn man es nicht kann, dann sicher. Die Hürde ist groß, aber das Ziel richtige Programme zu schreiben, die auf einer echten CPU laufen, ist schon toll. Du hast die Kontrolle über ALLES in C++, aber meistens arbeitest du ja eh nur mit Containers und Libs, wo du Probleme solcher Art wirklich nicht hast und wenn dann sind die recht schnell gefunden.

    Das Problem ist, das Java-Coder echt versaut sind. Nein nicht im sexuellen Sinne, sondern sie haben nie wirklich gelernt, wie man eine CPU + RAM programmiert. Sie sind so weit von der Natur aufgewachsen, dass man sie kaum noch darin aussetzen kann, ohne dass sie mosern.

    Ich habe auch lange gebraucht, um von diesem Java-Denken weg zukommen, das einfach falsch ist, so funktionieren Computer nun einmal nicht. Es hat schon seinen Grund, warum so viel Software in C++ und nicht in Java geschrieben wird. Gerade mit den mobilen Geräten ist jedes Watt/Recheneinheit wichtig. Und erst recht schlimm ist Java bei sicherheitskritischen Anwendungen. Was ist wenn einen Pumpe aus der Medizin ruckartig anläuft, weil gerade ein nicht groß kontrollierbarer Garbage Collector anspringt...das ist doch alles großer Mist mit Sahne.



  • @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



  • *aua* *aua* *aua*



  • 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

    Ich gehe nicht in ein Java-Forum und weise auf die vielen Fallstricke in Java hin. Ich werde nicht über Java her ziehen, da es respektlos ist. Und ich bitte Dich, nicht das gleiche mit C++ zu tun. Wenn Dir C++ nicht gefällt, dann behalt das bitte für Dich. Bzw. man kann natürlich Kritik äussern aber nicht mit solchen Aussagen wie "C++ ist mist".

    C++ ist sicher nicht perfekt. Genau die Konstruktion eines std::strings aus einem char ist einer def Fallstricke. Oder Dein angesprochenes Problem mit fehlendem return. Das sind berechtigte Kritikpunkte. Aber deswegen C++ als kompletten Mist abzutun, finde ich persönlich und sicher viele andere, die sich gerne hier im Forum tummeln unangebracht.

    Übrigens bekomme ich bei einer Funktion, wo das return fehlt bei gcc mit -Wall die Meldung foo.cpp:3:1: Warnung: keine return-Anweisung in nicht void zurückgebender Funktion [-Wreturn-type] . Bei clang bekomme ich bereits ohne Parameter foo.cpp:3:1: warning: control reaches end of non-void function [-Wreturn-type] . Wenn Deine IDE das verschluckt, solltest Du die IDE kritisieren und nicht den Compiler und schon gar nicht C++. Im übrigen empfehle ich sowohl bei gcc als auch clang den Parameter -pedantic .


Log in to reply