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



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



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


Anmelden zum Antworten