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

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    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 éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    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
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

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

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    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 éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    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]
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    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.

  7. #7
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    d'abord tu supposes que tu fais des suites ON/OFF...

    Ensuite tu utilises une structure, pour quelque chose qui de manière de base est une variable pure.

    Et enfin, le plus important c'est que tu ne faisais pas timerclear, et que tu fais
    les différences un à un au lieu du total.
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par souviron34

    tu fais des différences entre des nombres cycliques (60 secondes, 1.E06 microsecondes), et donc tes différences peuvent être négatives.

    Alors que si tu sommes les 2 en réel à chaque fois, ça ne fait que croître, et donc la différence est forcément toujours positive...
    OK, donc si je fais à la place

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    double t1=c->end.tv_usec*1e-6+c->end.tv_sec;
    double t2=c->start.tv_usec*1e-6+c->start.tv_sec;
    printf("elapsed time = %g sec\n",t1-t2);
    ce serait plus juste ?

    je tiens bien à préciser que je n'obstine pas utiliser ma foncion chrono. Je cherche vraiment à voir quelle est la différence entre nos deux méthodes, même si j'ai bien compris que ma méthode était bien foireuse...

    Merci encore de ta patience.

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