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 :

question sur la structure timeval


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut question sur la structure timeval
    Bonjour, je me suis fait un chronomère qui calcule à la microseconde en utilisant gettimeofday(). Voici mon .h

    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
     
    #include<stdlib.h>
    #include<stdio.h>
    #include <sys/time.h>
     
    enum ChronoState {RESET,ON,OFF,PRINT};
     
    typedef struct
    {
      enum ChronoState cs;
      struct timeval start,end;
      struct timezone tz;
    } Chronometer;
     
    void Chrono(Chronometer *,enum ChronoState);
    et voici mon .c

    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
    44
    45
     
    #include<stdlib.h>
    #include<stdio.h>
    #include <sys/time.h>
    #include "chrono.h"
     
    #define PERROR(msg) fprintf (stderr,"%s %d : Error : " #msg "\n",__FILE__,__LINE__)
     
    void Chrono(Chronometer * c,enum ChronoState cs)
    {
      if(cs==OFF)
      {
        if(c->cs!=ON)
          PERROR("Impossible to stop the chronometer : it wasn't launched\n");
        else
        {
          c->cs=cs;
          gettimeofday(&c->end,&c->tz);
        }
      }
      else if(cs==ON)
      {
        if(c->cs!=RESET)
          PERROR("Impossible to launch chronometer : its state is different of RESET\n");
        else
        {
          c->cs=cs;
          gettimeofday(&c->start,&c->tz);
        }
      }
      else if(cs==PRINT)
      {
        if(c->cs!=OFF)
          PERROR("Impossible to print elapsed time : the chronometer wasn't stopped\n");
        else
        {
          c->cs=cs;
          long nbsec=c->end.tv_sec-c->start.tv_sec; /* secondes number */
          long nbmicrosec=c->end.tv_usec-c->start.tv_usec; /* micro secondes number */
          double eltime=nbsec+nbmicrosec*1e-6;
          printf("Elapsed time : %g sec\n",eltime);
          c->cs=RESET;
        }
      }
    }
    mais qu'est-ce qui me garantit que nbsec et nbmicrosec seront positifs ou nuls ?

    Merci.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    c'est parce que tu ne dois pas passer par cette manière de stocker. C'est un peu comme avec les jours/mois, faire des différences t'amène à des calculs complexes.

    Si par contre tu stockes ta valeur dans un réel, secondes+micro (exemple : 1.000010 = 1 seconde + 10 microsecondes), là tu pourras faire facilement des différences.

    Voir l'exemple dans mon post http://www.developpez.net/forums/sho...87&postcount=9

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut, merci pour ta réponse si rapide.
    Je vais modifier mon code de ce pas !

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Re,
    souviron34, j'utilise donc ta fonction GetClock(). Voici mon prgm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int main(void)
    {
      unsigned i,x=0;
      double   t_start, t_end;
      t_start=GetClock();
      printf("t_start = %g\n",t_start);
      //for(i=0;i<10000;++i) x++;
      sleep(3);
      t_end=GetClock();
      printf("t_end = %g\n",t_end);
      printf("%g\n",t_end-t_start);
      return 0;
    }
    mais, qu'est-ce qui me garanti que t_end > t_start ? J'ai fait pas mal d'essai et je vois que c'est toujours le cas, mais pourquoi serait-ce toujours exact ?

    Merci.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    parce que c'est la définition même de gettimeofday :

    http://www.opengroup.org/onlinepubs/...timeofday.html

    en particulier :

    The gettimeofday() function shall obtain the current time, expressed as seconds and microseconds since the Epoch
    Donc ça ne fait que croître..

    [EDIT]

    Et ces fonctions, utilisées pour Windows et Linux, ont un équivalent dans Unix (sous au moins HPUX et IRIX ) (et qui est indiqué dans GetClock() ) :

    clock_gettime

    qui a pratiquement la même définition :

    http://www.opengroup.org/onlinepubs/...ck_getres.html

    All implementations support a clock_id of CLOCK_REALTIME defined in <time.h>. This clock represents the realtime clock for the system. For this clock, the values returned by clock_gettime() and specified by clock_settime() represent the amount of time (in seconds and nanoseconds) since the Epoch
    [/EDIT]

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Re,
    d'accord, je comprends mieux maintenant. Mais, quelle est la différence entre ma fonction chrono et la tienne ?
    Si, dans ma fonction, lorsque l'état de mon chrono vaut OFF, je mets un timerclear, est-ce que j'obtiendrais la même méthode que la tienne ?

    Je ne discerne pas très bien en quoi ce que j'ai fait est différent de ta fonction ?

    Encore merci.

Discussions similaires

  1. Question sur les structures de données
    Par sliderman dans le forum Débuter
    Réponses: 8
    Dernier message: 16/07/2008, 20h40
  2. Question sur ma structure imbriquées
    Par beegees dans le forum Débuter
    Réponses: 7
    Dernier message: 16/12/2007, 13h43
  3. question sur la structure SDL_SysWMinfo
    Par moustick1991 dans le forum SDL
    Réponses: 4
    Dernier message: 27/10/2007, 14h37
  4. [Bonne pratique] Question sur sa structure
    Par bucheron007 dans le forum Subversion
    Réponses: 1
    Dernier message: 15/10/2007, 20h49
  5. Petite question sur les structures
    Par progfou dans le forum C
    Réponses: 5
    Dernier message: 21/06/2006, 15h49

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