IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

calcul d'heures erroné


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Février 2007
    Messages : 97
    Par défaut calcul d'heures erroné
    Je dois calculer une durée, par exemple 10:00:00 - 09:45:00
    Cela doit évidemment me donner 00:15:00

    Avec mon code, cela fonctionne la plupart du temps et parfois le résultat et agrémenté de caractères parasites.

    Par exemple, en faisant la différence 13:38:26 - 05:45:24 j'obtiens le résultat 07:53:41\277\37759
    Où se trouve ma bourde?
    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    void FinTournee()
    	{
    	 int ledelta=0;	
    	 struct tm tm;
    	 int heures=0, minutes=0, secondes=0;
    	 char L_heure[10];
    	 char la_diff[10];
     
     
    	 //On renseigne les champs de fin de tournée
     	 fini=atoi(KMFin);
     	 depart=atoi(KMdepart);
    	 ledelta=fini-depart;	
     
     
    	  //Calculs de durée
             tm.tm_hour=0;
    	 tm.tm_min=0;
    	 tm.tm_sec=0;
     
    	 strptime(LHeureFin, "%H:%M:%S", &tm);
    	 heures=tm.tm_hour;
    	 minutes=tm.tm_min;
    	 secondes=tm.tm_sec;
     
    	 strptime(HDeb, "%H:%M:%S", &tm);
    	 tm.tm_hour=heures-tm.tm_hour;
    	 tm.tm_min=minutes-tm.tm_min;
    	 if (tm.tm_min<0)
    		{
    		 tm.tm_hour=tm.tm_hour-1;
    		 tm.tm_min=60+tm.tm_min;
    		}
    	 tm.tm_sec=secondes-tm.tm_sec;
    	 if (tm.tm_sec<0)
    		{
    		 tm.tm_min=tm.tm_min-1;
    		 tm.tm_sec=60+tm.tm_sec;
    		}
     
    	 strftime(L_heure,8, "%H:%M:%S", &tm);		
    	printf("L_heure: %s\n",L_heure);	
    }

  2. #2
    Membre confirmé Avatar de Laughing Man
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    ta chaine LHeure est trop grande
    elle fait 10 de long alors qu'il n'y a que 8 caractères qui t'intéresse
    les trucs incohérents à la fin doivent être (à mon avis vu la forme) des caractères spéciaux qui ne s'affichent pas et du coup il te donne le code correspondant à ces symboles

    change la taille de tes chaines et sa devrait rouler

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    elle fait 10 de long alors qu'il n'y a que 8 caractères qui t'intéresse
    Non, la taille de la chaîne importe peu. Effectivement, elle est un peu trop longue mais ce n'est pas très grave.

    Où se trouve ma bourde?
    Tu ne laisses pas assez de place à strftime pour écrire sa chaîne de caractères. Et il le mets où le '\0', strftime.
    Ca marchera mieux ainsi...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strftime(L_heure,9, "%H:%M:%S", &tm);
    Teste la valeur retournée par strftime. Elle retourne 0 quand la chaîne est trop courte.
    http://man.developpez.com/man3/strftime.3.php

    Personnellement, je trouve que tu te compliques la vie pour faire une différence d'heures enfin... J'espère que tu n'as pas à faire une différence de dates ainsi.

  4. #4
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Février 2007
    Messages : 97
    Par défaut
    Citation Envoyé par Laughing Man Voir le message
    ta chaine LHeure est trop grande
    elle fait 10 de long alors qu'il n'y a que 8 caractères qui t'intéresse
    les trucs incohérents à la fin doivent être (à mon avis vu la forme) des caractères spéciaux qui ne s'affichent pas et du coup il te donne le code correspondant à ces symboles

    change la taille de tes chaines et sa devrait rouler
    Hélas, non, c'est encore pire, en réduisant la chaîne à 8 caractères, ce qui fonctionnait ne fonctionne plus (cela me renvoie une chaîne du genre 10:45:1236 ou 10:45:91)
    à 9 caractères, le résultat est le même qu'à 10.

    Par contre, pour L_heure à 12 caractères, tout fonctionne, du moins pour les quelques données que j'ai. J'aimerais bien comprendre

  5. #5
    Membre confirmé Avatar de Laughing Man
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    ouais excuse moi j'ai zappé le \0

    donc du coup c'est bien 9

  6. #6
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Février 2007
    Messages : 97
    Par défaut
    Citation Envoyé par Laughing Man Voir le message
    ouais excuse moi j'ai zappé le \0

    donc du coup c'est bien 9
    Ben non. (cf mon message plus haut que je viens d'éditer)

  7. #7
    Membre confirmé Avatar de Laughing Man
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Par défaut
    ta essayé de faire ta chaine de longueur 9 et de rajouter le \0 à la main?

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    ta essayé de faire ta chaine de longueur 9 et de rajouter le \0 à la main?
    Il pourrait aussi écrire toute la chaîne à la main...

    J'aimerais bien comprendre
    Si ça marche pour 12, c'est uniquement de la chance. La chaîne finale tient sur 9 caractères. L_heure doit faire au moins 9 caractères et il faut mettre au moins 9 dans strftime. Point.
    Regardez la doc http://man.developpez.com/man3/strftime.3.php.
    La fonction strftime() renvoie le nombre de caractères écrits dans la table s, sans compter le caractère NUL final. Si la chaîne était trop courte, strftime() renvoie 0, et le contenu de la chaîne est indéfini. (Ceci, du moins, depuis la libc 4.4.4, des versions plus anciennes de la libc, comme la 4.4.1, renvoyaient max si la chaîne était trop courte)

  9. #9
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Février 2007
    Messages : 97
    Par défaut
    Citation Envoyé par aoyou Voir le message
    Si ça marche pour 12, c'est uniquement de la chance.
    Oui, je m'en doutais un peu
    Citation Envoyé par aoyou Voir le message
    La chaîne finale tient sur 9 caractères. L_heure doit faire au moins 9 caractères et il faut mettre au moins 9 dans strftime. Point.
    Regardez la doc http://man.developpez.com/man3/strftime.3.php.
    Bien sûr! Il ne suffit pas de modifier la taille de ma chaîne, il faut aussi modifier mon paramètre dans strftime()

    Merci!

  10. #10
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Rocou Voir le message
    Par exemple, en faisant la différence 13:38:26 - 05:45:24 j'obtiens le résultat 07:53:41\277\37759
    Où se trouve ma bourde?
    Voici mon code:
    Au secours ! Apprenre le C, difftime(), tout ça...

  11. #11
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : Février 2007
    Messages : 97
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Au secours ! Apprenre le C, difftime(), tout ça...
    Voilà qui est constructif

    Merci à Laughing Man et aoyou qui se sont donné la peine de répondre.
    Emmanuel, je lis régulièrement tes interventions sur le forum et je ne comprends pas ton attitude. En effet, si la documentation suffisait, ce forum serait inutile.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Dates] Calcules avec heures
    Par Pahcixam dans le forum Langage
    Réponses: 17
    Dernier message: 21/08/2006, 21h50
  2. calcul des heures
    Par meddeb2001 dans le forum Access
    Réponses: 2
    Dernier message: 06/07/2006, 17h55
  3. probleme avec le calcul des heures
    Par aibar dans le forum Access
    Réponses: 1
    Dernier message: 14/06/2006, 00h38
  4. [VBA-e] Calcul d'heure
    Par climz dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 11/05/2006, 16h02
  5. [Dates] Calcul d'heure
    Par Kyvin dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2006, 08h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo