Zeiten addieren


  • Mod

    Guck dir mal das Beispiel hier an:
    http://en.cppreference.com/w/cpp/chrono/time_point



  • Die aktuelle Systemzeit lässt sich über std::chrono:: Clock-Typ ::now() bekommen. Für Clock-Typ kannst du bspw. system_clock einsetzen.

    Du berechnest also die Zeit, die du brauchst - diese speicherst du in std::chrono::duration - mein Vorschlag wäre bspw. std::chrono::seconds *. Genauer als auf Sekunden willst du es sowieso nicht haben.

    Anschließend tust du das:

    using namespace std::chrono;
    
        seconds dur{ ... }; // dur enthält die benötigte Zeit in Sekunden
    
        system_clock::time_point ready = system_clock::now() + dur; // ready ist der Zeitpunkt, zu dem wasauchimmer fertig ist
    
        auto ctime = system_clock::to_time_t(ready);
    
        char ready_string[64];
        std::strftime( ready_string, sizeof(ready_string), "%H:%M:%S", std::localtime(&ctime) );
    
        std::cout << "Ready in " << ready_string;
    

    P.S.: OGame... meine ganze Klasse spielt das. 🙄

    *Der Link ist derselbe, aber scroll mal runter.



  • Was ich mich in diesem Zusammenhang immer frage: Warum gibt es keine komfortable "C++-Style"-Möglichkeit, eine std::chrono::time_point auszugeben? Warum muss man immer über mehrere umständliche C-Funktionen gehen die meist auch nicht threadsicher sind? Gibt es einen triftigen Grund für diese Designentscheidung bei C++11?


  • Mod

    TNA schrieb:

    Was ich mich in diesem Zusammenhang immer frage: Warum gibt es keine komfortable "C++-Style"-Möglichkeit, eine std::chrono::time_point auszugeben? Warum muss man immer über mehrere umständliche C-Funktionen gehen die meist auch nicht threadsicher sind? Gibt es einen triftigen Grund für diese Designentscheidung bei C++11?

    Gibt es:
    http://www.cplusplus.com/reference/iomanip/put_time/
    Threadsicherheit ist die, die man beim Einfügen in einem Stream erwarten würde, ansonsten ist die Funktion reentrant.

    strftime sollte übrigens auch threadsicher sein.

    Das wahre Rätsel ist: Wieso hat ausgerechnet Sone, der C++11-Vorreiter, es nicht benutzt? 😕



  • Hui, kannte ich ja gar nicht, tut mir Leid.


  • Mod

    SeppJ schrieb:

    Das wahre Rätsel ist: Wieso hat ausgerechnet Sone, der C++11-Vorreiter, es nicht benutzt? 😕

    💡

    Sone schrieb:

    Hui, kannte ich ja gar nicht, tut mir Leid.

    Dass ich das noch erlebe 🙂 . Ich hatte das Gefühl, du kennst inzwischen die ganze C++11-Standardbibliothek auswendig.



  • Ist aber nicht weiter verwunderlich. Wie ich mich gerade erinnere habe ich diese Funktion schon mal zu benutzen versucht, allerdings unterstützt nicht einmal die offizielle MinGW GCC 4.8 Version std::put_time (wird nicht gefunden, und ja, ich binde <iomanip> ein) das - schade eigentlich.

    SeppJ schrieb:

    Sone schrieb:

    Hui, kannte ich ja gar nicht, tut mir Leid.

    Dass ich das noch erlebe 🙂 . Ich hatte das Gefühl, du kennst inzwischen die ganze C++11-Standardbibliothek auswendig.

    Was für ein extremer Sarkasmus 😞
    Womit habe ich das verdient?



  • SeppJ schrieb:

    Gibt es:
    http://www.cplusplus.com/reference/iomanip/put_time/
    Threadsicherheit ist die, die man beim Einfügen in einem Stream erwarten würde, ansonsten ist die Funktion reentrant.

    Das ist natürlich richtig. Für put_time benötigt man ein std::tm (Warum eigentlich?). Um das aus einem std::chrono::time_point zu bekommen muss man erst wieder mit C über einen weiteren Zwischenschritt umkonvertieren. std::localtime ist dabei nicht threadsicher.


  • Mod

    Sone schrieb:

    SeppJ schrieb:

    Sone schrieb:

    Hui, kannte ich ja gar nicht, tut mir Leid.

    Dass ich das noch erlebe 🙂 . Ich hatte das Gefühl, du kennst inzwischen die ganze C++11-Standardbibliothek auswendig.

    Was für ein extremer Sarkasmus 😞
    Womit habe ich das verdient?

    Gar nicht. Dein Sarkasmusdetektor ist kaputt.

    TNA schrieb:

    std::localtime ist dabei nicht threadsicher.

    Stimmt. Muss mal im Standard gucken, ob es was besseres gibt.



  • Hi, Sone

    könntest du was du gepostet hast vielleicht mal mit using namespace std; schreiben also, ohne die ganzen std::...

    Ich kann den Code so einfach kein bisshen lesen, wir verwenden in den Vorlesungen nicht diese Notation und ich blick da echt kein bisshen durch.



  • UnterKind schrieb:

    Hi, Sone

    könntest du was du gepostet hast vielleicht mal mit using namespace std; schreiben also, ohne die ganzen std::...

    Ich kann den Code so einfach kein bisshen lesen, wir verwenden in den Vorlesungen nicht diese Notation und ich blick da echt kein bisshen durch.

    Ihr kennt den Scope-Operator nicht? Wahnsinn. Brauchst du. Sonst verstehst du nur die Hälfte aller Online-Beispiele. Oder auch nur ein Fünftel.

    Übrigens, da sind ungefähr zwei nested-name-specifier für std , nicht mehr. 😉



  • Ja, denn er hat schon "using namespace std::chrono" geschrieben.
    Ohne das sähe das so aus.

    Sone schrieb:

    [code="cpp"

    std::chrono::seconds dur{ ... }; // dur enthält die benötigte Zeit in Sekunden

    std::chrono::system_clock::time_point ready = std::chrono::system_clock::now() + dur; // ready ist der Zeitpunkt, zu dem wasauchimmer fertig ist

    auto ctime = std::chrono::system_clock::to_time_t(ready);

    char ready_string[64];
    std::strftime( ready_string, sizeof(ready_string), "%H:%M:%S", std::localtime(&ctime) );

    std::cout << "Ready in " << ready_string;[/code]

    Du solltest dir aber diese Schreibweise angewöhnen.
    Besonders wenn du später mehrere Libs nutzt, wirst du zugeballert mit Namespaces.
    Und teilweise gibt es dann Konflikte, weil bspw. cout in einer anderen Lib eine ganz andere Bedeutung hast.
    Dann musst du entweder schreiben std::cout oder andere_lib::cout, je nachdem was du willst.
    Und using namespace std; sollte man ohnehin NIE in Header schreiben.


Anmelden zum Antworten