Zeiten addieren
-
Hi,
ich hab letztens wieder angefangen ogame zu spielen.
Beim spielen kam mir die Idee ein Programm zu schreiben bei dem ich die mir ausrechnen lassen kann zu welchem Zeitpunkt ich die benötigten Rohstoffe zur verfügung habe.In der ersten Version, kriege ich nur die Ausgabe darüber in wie viel Stunden/Minuten/Sekunden ich genug Rohstoffe hab.
Ich wollte in der zweiten Version jetzt, aber mir eine Ausgabe einbauen die mir sagt "Um XX:XX:XX Uhr hast du genug Rohstoffe".
Ich hab inzwischen rausgefunden das ich mit #include <time.h> einige Zeitfunktionen reinhole, doch wie addier ich nun meine benötigte Zeit mit der Systemzeit?
-
Hört sich eher nach einem Fall für
#include <chrono>an. Damit lässt sich gut mit Zeitpunkten und Zeiträumen rechne.
-
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_clockeinsetzen.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?
-
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.
-
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.
-
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.