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 :

Overflow calcul de durée avec Timer


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Par défaut Overflow calcul de durée avec Timer
    Bonjour,

    Je n'arrive pas a trouver de réponse dans le forum, donc je pose ma question.
    Voila, j'ai un timer, et je veux calculer des durée entre deux moments.

    J'ai donc deux variables, time1 et time2. Je calcul le temps en faisant time2-time1

    Seulement, il y a un cas ou cela ne fonctionne plus. Quand time1 prends la valeur max du timer (0xF FFFF), et que time2 vaut 0, la valeur calculée est alors négative.

    Y a t il une solution simple pour avoir toujours une valeur positive représentant le compte entre time1 et time2?

    Merci

  2. #2
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    En faite, le temps se calcule par : t1 - t2 si t1 > t2 sinon, c'est l'inverse.

    dans ton cas, t1 > t2 donc, il faudrait plutot que tu fasses t1-t2 = ton temps que tu veux.

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Flob91 Voir le message
    En faite, le temps se calcule par : t1 - t2 si t1 > t2 sinon, c'est l'inverse.

    dans ton cas, t1 > t2 donc, il faudrait plutot que tu fasses t1-t2 = ton temps que tu veux.
    Il y a une grosse erreur de logique dans ce que tu avances. Si t1 > t2, alors il est certain que le timer s'est réinitialisé (repassé par 0, à cause d'un dépacement de capacité) entre les instants t1 et t2. Si on admet aussi que le temps mesuré n'est jamais supérieur à TIMER_MAX (le 0xF FFFF de cauriera), alors dans ce cas temps_ecoulé = (TIMER_MAX - t1) + t2. Sinon temps_écoulé = t2 - t1.

  4. #4
    Membre éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 100
    Par défaut
    Citation Envoyé par Melem Voir le message
    Il y a une grosse erreur de logique dans ce que tu avances. Si t1 > t2, alors il est certain que le timer s'est réinitialisé (repassé par 0, à cause d'un dépacement de capacité) entre les instants t1 et t2. Si on admet aussi que le temps mesuré n'est jamais supérieur à TIMER_MAX (le 0xF FFFF de cauriera), alors dans ce cas temps_ecoulé = (TIMER_MAX - t1) + t2. Sinon temps_écoulé = t2 - t1.
    En effet.
    On peut étendre ce raisonnement en ayant un compteur de boucle :

    temps ecoulé = (Timer_Max*i -t1) + t2.

    avec i le nombre de boucles de compteur effectués.
    mais bon, ca, ca dépends de l'echelle de temps du timer

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Par défaut
    Ha oui c'est pas mal comme cela en effet.

    Par contre, j'ajouterais un +1 à la formule.
    Avec t1 = 0x F FFFF
    et t2 = 0

    Le delta de temps est de 1, il faut donc:
    (TIMER_MAX + 1 - t1) + t2

    Non?

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Si tu es certain que la valeur maximum de ton timer est de type 0xFFFFF…, c'est-à-dire 1111111… en binaire, et donc qu'elle précède une puissance de 2, alors tu peux utiliser deux entiers non signés et faire un & bit-à-bit avec cette valeur maximum de manière à reproduire ce qu'il se passe lors du débordement d'un entier signé en temps normal :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <stdio.h>
     
    #define MAX_TIMER 0xFFFFF
     
    int main (void)
    {
        unsigned int time1 = 0xffffa;
        unsigned int time2 = 1;
     
        printf ("Temps écoulé : %d\n",(time2-time1) & MAX_TIMER);
        return 0;
    }
     
    $ ./timer
    Temps écoulé : 7

    De cette manière, tu obtiendras toujours la bonne réponse.

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

Discussions similaires

  1. [CR XI] Calcule la durée du mois avec les date en cheval
    Par SophieTaureau dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 28/06/2012, 15h08
  2. formule de calcul du TRI avec PL/SQL
    Par mongilotti dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 30/07/2005, 20h23
  3. composant de calcul [champ date] avec rave report
    Par segnac dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/06/2005, 19h08
  4. Calculer une duree entre 2 dates
    Par d.w.d dans le forum C++
    Réponses: 7
    Dernier message: 02/03/2005, 22h39
  5. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02

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