printf in C++?



  • Janjan schrieb:

    oder das auffüllen mit Zeichen, wenn der Wert nicht lang genug ist, oder das definieren der Genauigkeit von Fließkommazahlen.

    QString("Der Wert %1 kann von dem anderen Wert %2 zu %3%% abweichen", "Abweichungshinweis")
         .arg(wert, 3, 'f', 2)
         .arg(awert, 3, 'f', 2)
         .arg(prozent, 3, 'f', 2);
    

    Großer Vorteil hierbei ist das dieser String SEHR leicht noch durch den Linguist (Übersetzungstool von Qt) laufen kann und von diesem als ein String erkannt wird. Die Zerstückelung die man bei Streams hat, verhindert meist jede komfortable Internationalisierung.



  • Hmm ok, das wird schwierig.

    Gut dann anders herrum, warum gibt es nicht beide Möglichkeiten einmal das cout für spezielle Anforderungen und einmal einen sicheren printf wie ich ihn beschrieben haben?



  • Fellhuhn schrieb:

    Großer Vorteil hierbei ist das dieser String SEHR leicht noch durch den Linguist (Übersetzungstool von Qt) laufen kann und von diesem als ein String erkannt wird. Die Zerstückelung die man bei Streams hat, verhindert meist jede komfortable Internationalisierung.

    Wieso das? Du kannst über Facetten sehr fein steuern, was wie internationalisiert werden soll. Ohne sich an Qt zu binden.



  • @Fellhuhn: ja genau sowas habe ich gesucht wunderbar, warum nehmen die qt nicht in der standard auf, dann wäre c++ eine geile sprache mit geilem framework...



  • Tachyon schrieb:

    Wieso das? Du kannst über Facetten sehr fein steuern, was wie internationalisiert werden soll. Ohne sich an Qt zu binden.

    Wie?

    Wenn du folgendes hast:

    cout << "Der Wert " << wert << " kann von dem anderen Wert " << awert << " zu " << prozent << "% abweichen" endl;
    

    Sind das 4 Strings die übersetzt werden müssen. Klar kannst du diese durch die jeweilige Sprachenrepräsentation ersetzen, allerdings bist du dann an die Reihenfolge von String und Wert gebunden und kannst hier nichts tauschen.

    EDIT:

    Denn ob QString("%1 ist größer %2").arg(10).arg(5) oder QString("%2 ist kleiner als %1").arg(10).arg(5) ist egal. Nur der String hat sich geändert (sagen wir dank Internationalisierung, auch wenn dieses Beispiel nicht gerade Sinn macht) und du hast keine einzige extra Zeile Code.

    Ob dies nun dank Qt geschieh oder durch eine eigene Implementierung ist egal, mächtiger als Streams ist es auf jeden Fall.



  • @Fellhuhn: Daran habe ich noch gar nicht gedacht, klar mir cout geht jeder Internationalisierung den Bach runter. Keine Trennung von Code und Content das ist ganz übles Design...



  • Fellhuhn schrieb:

    ...

    Okay, was das betrifft hast Du recht. Aber da würde ich eher zu boost::format greifen, glaube ich.
    Qt finde ich an vielen stellen ziemlich grausam. Vor allem bei Dingen, die MOC erzeugt. Außerdem bindet man sich dabei ziemlich viele Bibliotheken an den Hals.



  • Tachyon schrieb:

    Fellhuhn schrieb:

    ...

    Okay, was das betrifft hast Du recht. Aber da würde ich eher zu boost::format greifen, glaube ich.
    Qt finde ich an vielen stellen ziemlich grausam. Vor allem bei Dingen, die MOC erzeugt. Außerdem bindet man sich dabei ziemlich viele Bibliotheken an den Hals.

    Das ist richtig. Hat die alte Qt-Krake einmal Wurzeln geschlagen bekommt man die nur schwer wieder raus. Und wehe man hält sich nicht an die kryptischen Compile-Vorgänge... Auch wenn es sehr komfortabel ist. Aber man kann sich dort auch viel abschauen, weil da echt viele gute Ideen drinstecken.

    Wobei ich bei Konsolenanwendungen und kleinen Programmen natürlich auch mit Streams arbeite. Wenn man aber eh eine Qt-Applikation schreibt, spricht ja nichts dagegen auch die Qt-Möglichkeiten zu nutzen. 🙂



  • Code::Blocks?
    Eclipse?



  • Busterman schrieb:

    ...

    ich hab die QT-Creator-Diskussion mal ausgelagert:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-267677.html



  • Vielleicht will ja auch mal jemand mit C++0x eine Funktion schreiben, die Formatstrings mit Typsicherheit vereint:
    http://en.wikipedia.org/wiki/C%2B%2B0x#Variadic_templates



  • Fellhuhn schrieb:

    Tachyon schrieb:

    Wieso das? Du kannst über Facetten sehr fein steuern, was wie internationalisiert werden soll. Ohne sich an Qt zu binden.

    Wie?

    Ja wie? das ist hier die Frage. Ich bin mit Tachyon einer Meinung, dass man das schon 'fein steuern' kann.

    In diesem Fall

    Fellhuhn schrieb:

    Wenn du folgendes hast:

    cout << "Der Wert " << wert << " kann von dem anderen Wert " << awert << " zu " << prozent << "% abweichen" endl;
    

    sollte das wohl so gar nicht in einer zu internationalisierenden Applikation auftauchen, sondern eher etwas wie:

    cout << fulltext << abweichung << endl;
    

    fulltext sei ein Manipulator, der anzeigt, dass hier ein ganzer Satz ausgegeben wird und abweichung sei ein Objekt einer noch zu spezifizierenden Klasse. Jetzt hat man alle Möglichkeit mit Hilfe von Facetten eine Internationalisierung zu realisieren. Aber die Flexibilität ist jetzt eben so groß, dass man auch relativ viel tun muss. QT dagegen bietet dagegen ein festes praktikales Verfahren und fertig - damit ist der Aufwand geringer.

    In der Praxis ist das mit den Facetten und der Internatinalisierung und den Messages (benutzt kein Mensch) also eher zu viel des Guten. Es wird auch nach meiner Erfahrung praktsch nie so gemacht. Es ist vielleicht zu flexibel und auch zu abstrakt.

    Qt (und andere Frameworks) bieten eine praktikabele Lösung an, die bei Verwendung des einen oder anderen Frameworks natürlich auch immer angewendet wird.

    Busterman schrieb:

    @Fellhuhn: Daran habe ich noch gar nicht gedacht, klar mir cout geht jeder Internationalisierung den Bach runter. Keine Trennung von Code und Content das ist ganz übles Design...

    .. das ist so falsch. Code und Content lassen sich schon trennen und das Design ist eher 'zu gut' (s.o.) - deshalb sieht es keiner. Ich glaube mit Streams können weniger als 50% der C++-Coder wirklich umgeben, weil die meisten es gar nicht brauchen, die Alternativen werden ja immer zusammen mit der verwendeten Umgebung angeboten.

    Und wer kennt sich schon mit dem Erstellen von user defined Facetten aus!

    Gruß
    Werner


Anmelden zum Antworten