fehler beim auswerten eines Zeichens aus einem String in einem CASE



  • Wutz schrieb:

    Sogar...benutzerfreundlicher als in C++.

    Dem Benutzer dürfte es doch ziemlich schnuppe sein, ob der Code in C oder in C++ geschrieben wurde und das Programm sollte sich in beiden Fällen nach außen gleich verhalten. Wenn ein Benutzer z.B. etwas in der Konsole eingeben soll, kriegt er also nicht mit, ob nun ein fgets oder ein cin dahinter steckt.
    Begründe mal deine Aussage, wenn sie nicht als Nonsens angesehen werden soll.



  • häh?! schrieb:

    Wenn ein Benutzer z.B. etwas in der Konsole eingeben soll, [...]

    Wie wäre es mit Benutzer = Benutzer von C bzw. C++ = Programmierer?
    Etwas Textverständnis sollte schon vorausgesetzt werden können, zumal es hier alle Poster vor dir verstanden haben.



  • käpsele schrieb:

    Kellerautomat schrieb:

    Wutz schrieb:

    Sogar effizienter und benutzerfreundlicher als in C++.

    Also ich weiss ja nicht wie's dir geht, aber Konstruktoren und Destruktoren manuell aufzurufen ist nicht mein Ding.

    Was haben Konstruktoren mit Kapselung zu tun?

    Nichts. Hab ich auch nicht behauptet.
    Ich habe damit gemeint, dass ich C besonders deshalb nicht leiden kann, weil es kein RAII kann.



  • lol?! schrieb:

    häh?! schrieb:

    Wenn ein Benutzer z.B. etwas in der Konsole eingeben soll, [...]

    Wie wäre es mit Benutzer = Benutzer von C bzw. C++ = Programmierer?
    Etwas Textverständnis sollte schon vorausgesetzt werden können, zumal es hier alle Poster vor dir verstanden haben.




  • Kellerautomat schrieb:

    Ich habe damit gemeint, dass ich C besonders deshalb nicht leiden kann, weil es kein RAII kann.

    C braucht das auch nicht, weil es keine Exceptions kennt.

    Das Problem an RAII ist, dass es nicht ausschaltbar ist. Es macht genau 0 Sinn, den Destruktor von einem moved-from unique_ptr aufzurufen oder von einem sicher leeren Vektor. Und vor C++ war RAII noch schrecklicher, oder wie möchtest du ein Objekt, das klar nicht kopierbar ist aus einer Funktion rausbefördern? Das ging nur mit einer zusätzlichen Indirektion à la Pointer aka Anti-RAII oder auto_ptr aka DesignFailure oder shared_ptr aka Selbst-Java-Ist-Schneller.

    RAII ist sehr oft sehr praktisch, aber manchmal ginge es benutzerfreundlicher und effizienter.



  • käpsele schrieb:

    RAII ist sehr oft sehr praktisch, aber manchmal ginge es benutzerfreundlicher und effizienter.

    Wie? Wo? Wann? Beispiel? Ich hatte mit RAII noch nie iregendwelche Probleme, du schon?



  • käpsele schrieb:

    Kellerautomat schrieb:

    Ich habe damit gemeint, dass ich C besonders deshalb nicht leiden kann, weil es kein RAII kann.

    C braucht das auch nicht, weil es keine Exceptions kennt.

    HANDLE_TO_STH handle = create_handle(some_params);
    if (!handle)
        return ERR_NOT_CREATED;
    
    if (!do_something_with(handle));
        return SOME_OTHER_ERR;
    
    destroy_handle(handle);
    return ALL_RIGHT;
    

    Ups.



  • Schlechten Code kann man in allen Programmiersprachen schreiben oder willst du dass ich ein Beispiel mit new/delete bringe?

    int do_this_with_handle(HANDLE* handle)
    {
      if (!do_something_with(handle));
        return SOME_OTHER_ERR;
    
      return ALL_RIGHT;
    }
    
    HANDLE_TO_STH handle = create_handle(some_params);
    if (!handle) {
      perror("bad luck");
    } else {
      if (do_this_with_handle(handle) == ALL_RIGHT)
        puts("all right")
      destroy_handle(handle);
    }
    


  • käpsele schrieb:

    Schlechten Code kann man in allen Programmiersprachen schreiben oder willst du dass ich ein Beispiel mit new/delete bringe?

    Klar, kann man schlechten Code schreiben.
    Aber nehmen wir mal an, man nutzt das handle mit einer Funktion, die, wenn sie schief geht auch keine Zerstörung erfordert (nur ein Beispiel). Dann kommt irgendwann ein anderer Programmierer daher, muss unter Zeitdruck ein weiteres Feature einbauen und fügt nur mal eben die do_something_with() mit Fehlerbehandlung ein (so wie ich das hatte, nicht so wie du das hattest).
    So, und nun?
    Was ich sagen will: mit RAII kann so etwas überhaupt nicht passieren. Jeder macht mal Fehler, wir sind auch nur Menschen.
    Und delete nutzt man in gutem C++ (mit RAII) sowieso nicht.



  • 🙄

    Ich sage ja nicht, dass RAII schlecht ist. RAII und C++, das passt gut zusammen, RAII und Non-Memory-Ressourcen, das ist eine super Lösung. Allerdings: File-Handling ist nur ein geringer Teil im Code. Den Code, der die Aktion ausführt in eine Funktion auszulagern und den Funktionsaufruf zwischen ein open/close einschieben ist ohne Exceptions ein gangbarer Workaround (dann kann man auch mal eben so was im Code hinzufügen).

    Ich sage nur, dass RAII auch Probleme hat. Schreib in pre-C++11 mal eine Funktion, die einen ofstream zurückgibt => nur mit Hacks möglich. Und wenn du das in C++11 mit move() geschafft hast, versuch dann mal, den unsinnigen Destruktoraufruf zu verhindern => nur mit Hacks möglich.



  • Ich sage ja auch nicht, das du sagst, dass RAII schlecht ist. 😉
    Ich bezog mich lediglich auf die Aussage, dass RAII in C unnötig ist. Ist es nicht. Es wäre schön, RAII in C zu haben.



  • Sagen wir so, in C++ ist RAII essentiell, in C wäre es u.U. schön. Aber schön wäre auch, es unter manchen Umständen abstellen zu können.



  • Stimme dir zu.
    Allerdings sind die Kosten der Destruktoren in deinem Beispiel auch nicht sonderlich groß.


Anmelden zum Antworten