2016-04-23 12 views
1

Ich muss in der Lage sein, zwei Variablen (eine Art Zeitvariable) zu füllen, dann in der Lage sein, ihre Differenz zu berechnen. nach all meinen Suchen fand ich difftime, aber mein Problem ist, dass es time_t Variablen verwendet, und ich weiß nicht, wie man eine 'time_t' mit der Zeit füllt, die ich will. zum Beispiel i Benutzer möchten eingeben Time_1 und time_2 als (10.04, 11.05) und es in der Lage sein Unterschied in Sekunden oder Minuten oder Stunden oder etwas zu zeigen. (ZB 61 min)Unterschied von zwei Benutzer eingegebene Zeit C++

ich versuchte, als blasen, aber es nicht funktioniert hat:

#include <iostream> 
#include <ctime> 
using namespace std; 
void main() 
{ 
    tm time_1 = {0, 0, 0, 1, 0, 0, 0, 0, 0}; 
    tm time_2 = {0, 0, 0, 1, 0, 0, 0, 0, 0}; 

    time_1.tm_hour = 10; 
    time_1.tm_min = 4; 

    time_2.tm_hour = 11; 
    time_2.tm_min = 5; 

    double diff = difftime (mktime(&time_2),mktime(&time_1)); 

    cout << diff << endl; 

    system("pause"); 
} 
+0

* aber es hat nicht funktioniert * - bitte fügen Sie Ihre Frage zu erklären ** wie es nicht funktioniert **. Gab es einen Fehler? Haben Sie eine unerwartete Ausgabe erhalten? –

+0

Ich meine, es zeigt nur 0 Ausgabe, was nicht wahr ist, sollte es 3660 sein (difftime zeigt Sekunden) –

+0

Beide 'mktime' Aufrufe geben' -1' zurück und zeigen Fehler an. Kein Wunder, dass 'difftime (-1, -1)' gleich Null ist. –

Antwort

2

std::tm folgende Mitglieder hat (http://en.cppreference.com/w/cpp/chrono/c/tm):

int tm_sec; // seconds after the minute – [0, 61](until C++11)/[0, 60] (since C++11) 
int tm_min; // minutes after the hour – [0, 59] 
int tm_hour; // hours since midnight – [0, 23] 
int tm_mday; // day of the month – [1, 31] 
int tm_mon; // months since January – [0, 11] 
int tm_year; // years since 1900 
int tm_wday; // days since Sunday – [0, 6] 
int tm_yday; // days since January 1 – [0, 365] 
int tm_isds; // Daylight Saving Time flag. 

Sie nur einige dieser Elemente initialisiert haben. Der Rest ist für beide Objekte nicht initialisiert.

Daher hat Ihr Programm undefiniertes Verhalten.

Um ein vorhersagbares Verhalten zu erkennen, initialisieren Sie die Objekte ordnungsgemäß. Eine Möglichkeit ist:

tm time_1 = {0, 0, 0, 1, 0, 0, 0, 0, 0}; 
tm time_2 = {0, 0, 0, 1, 0, 0, 0, 0, 0}; 

vor dem Lesen der Benutzereingabe.

aktualisieren

std::time_t t = std::time(NULL); 
std::tm time_1 = *std::localtime(&t); 
tm time_2 = time_1; 

Mit time_1 und time_2 zu initialisieren scheint für mich zu arbeiten.

Sehen Sie es bei http://ideone.com/AmCzTu funktioniert.

+0

Ich denke, Sie müssen nur 'tm_hour',' tm_min', 'tm_sec',' tm_mon' und 'tm_mday' initialisieren. [Beispiel] (http://cpp.sh/3wti). +1 besser als Nachsicht. –

+0

'tm time_1 = {0};' ist eine vollständige Initialisierung, aber keine gültige Initialisierung. Obwohl Sie kein undefiniertes Verhalten haben, wird 'mktime()' wegen ungültiger Eingaben abbrechen. Wenn 'mktime()' fehlschlägt, gibt es '-1' zurück, und die Differenz zwischen zwei '-1' ist Null, wie von OP beobachtet. –

+0

@BenVoigt, guter Punkt. Die Antwort wurde aktualisiert. –