2016-04-23 1 views
1

Je dois pouvoir remplir deux variables (une sorte de variable de temps), puis être capable de calculer leur différence. après toutes mes recherches j'ai trouvé difftime, mais mon problème est que, il utilise time_t variables, et je ne sais pas comment remplir un 'time_t' avec le temps que je veux. par exemple je veux user user time_1 et time_2 as (10:04, 11:05) et il peut montrer la différence en sec ou minute ou heure ou n'importe quoi (par exemple 61 min)différence de deux heures saisies par l'utilisateur C++

j'ai essayé en tant que souffler, mais il n'a pas fonctionné:

#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

* mais cela n'a pas fonctionné * - veuillez ajouter à votre question en expliquant ** comment cela n'a pas fonctionné **. Y a-t-il eu une erreur? Avez-vous reçu une sortie inattendue? –

+0

je veux dire qu'il montre juste 0 sortie, ce qui n'est pas vrai, il devrait être 3660 (difftime montre secondes) –

+0

Les deux appels 'mktime' retournent' -1', indiquant l'échec. Pas de surprise que 'difftime (-1, -1)' soit zéro. –

Répondre

2

std::tm a les membres suivants (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. 

Vous avez initialisé deux seulement de ces membres. Le reste n'est pas initialisé pour les deux objets. Par conséquent, votre programme a un comportement indéfini

Pour voir un comportement prévisible, initialisez correctement les objets. Une façon est d'utiliser:

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

avant de lire l'entrée utilisateur.

Mise à jour

En utilisant

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

Pour initialiser time_1 et time_2 semble fonctionner pour moi. Il fonctionne à http://ideone.com/AmCzTu.

+0

Je pense que vous avez juste besoin d'initialiser 'tm_hour',' tm_min', 'tm_sec',' tm_mon' et 'tm_mday'. [Exemple] (http://cpp.sh/3wti). +1 mieux vaut prévenir que guérir. –

+0

'tm time_1 = {0};' est une initialisation complète, mais pas valide. Bien que vous n'ayez pas de comportement indéfini, 'mktime()' s'annulera en raison d'entrées non valides. Quand 'mktime()' échoue, il renvoie '-1', et la différence entre deux' -1' est nulle comme observé par OP. –

+0

@BenVoigt, bon point. Mise à jour de la réponse –