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 :

Clock() s'arrête sur getchar!


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut Clock() s'arrête sur getchar!
    Bonjour à tous,
    me revoilà, toujours dans le même contexte.

    Cette fois mon problème se pose sur l'utilisation de la fonction clock().
    J'utilise la fonction clock dans un programme qui calcul le temps écoulé depuis son lancement pour une application en jeux de rôle.

    Mon problème, lors d'un arrêt du programme sur getchar, clock s'arrête. Après vérification, clock calcul le temps processeur et donc il est évident qu'il s'arrête sur le getchar.
    Or, sur windows clock calcul le temps depuis le lancement du programme.

    Pour simplifier la compréhension du code, j'ai fait une simplification permettant de tester le fonctionnement de clock dans des conditions similaires au programme réel.
    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
    #include <stdio.h>
    #include <time.h>
     
    int main ()
    {
      int n;
      float start2, end2;
      clock_t start_timer, end_timer;
      start2 = clock_second (clock());
      time(&start_timer);
          printf ("Starting countdown...\n");
          for(n=0;n<99999999;n++);
          printf ("FIRE!!!\n");
      end2 = clock_second (clock());
      time(&end_timer);
      printf("Temps en secondes: %f\n", (end2-start2));
      printf("Temps en secondes: %f\n", (float)(end_timer-start_timer));
      //Avec getchar();
      puts("ok");
      getchar();
      time(&start_timer);
          printf ("Starting countdown...\n");
          //for(n=0;n<99999999;n++);
          getchar();
          printf ("FIRE!!!\n");
      time(&end_timer);
      printf("Temps en secondes: %f\n", (float)(end_timer-start_timer));
      return 0;
    }
     
    float clock_second (clock_t tps)
    {
        return (tps/(float)CLOCKS_PER_SEC);
    }
    Je cherche donc une alternative à clock sur linux qui ne s'arrête pas lors du getchar.
    Comme on peux le constater sur le code ci-dessus j'ai fais un essai avec time. Non concluant car j'obtient en résultat un entier (soit 1s ou 2s lors de mes tests) alors que clock me renvoi un float.
    J'en appele donc à vos connaissance .

    Cordialement,
    Maniack Crudelis

  2. #2
    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 Maniack Crudelis Voir le message
    Cette fois mon problème se pose sur l'utilisation de la fonction clock().
    J'utilise la fonction clock dans un programme qui calcul le temps écoulé depuis son lancement pour une application en jeux de rôle.
    time()

    C'est l'embrouille avec les types...

    time() retourne un time_t et clock() un clock_t. C'est pas très difficile de s'en souvenir...

    Ceci fonctionne
    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
     
    #include <stdio.h>
    #include <time.h>
     
    double clock_second (clock_t ticks)
    {
       return (ticks / (double) CLOCKS_PER_SEC);
    }
     
    int main (void)
    {
       {
          clock_t start2 = clock ();
          time_t start_timer = time (NULL);
     
          printf ("Starting countdown...\n");
          {
             unsigned long volatile n;
             for (n = 0; n < 1lu << 30; n++)
             {
             }
          }
          printf ("FIRE!!!\n");
          {
             clock_t end2 = clock ();
             time_t end_timer = time (NULL);
     
             printf ("Temps en secondes: %f (clock)\n",
                     clock_second (end2 - start2));
             printf ("Temps en secondes: %f (time)\n",
                     (double) (end_timer - start_timer));
          }
       }
     
       return 0;
    }
    et donne un résultat cohérent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Starting countdown...
    FIRE!!!
    Temps en secondes: 4.962000 (clock)
    Temps en secondes: 5.000000 (time)
     
    Process returned 0 (0x0)   execution time : 5.004 s
    Press any key to continue.
    Si la précision de time() ne convient pas, voir des fonctions non portables comme gettimeofday() etc. Ca dépend alors du système.

    Mais pour des durées mesurées de plusieurs minutes, voir plus, la précision de 1 seconde est suffisante (seul problème, elle n'est garantie sur les systèmes POSIX).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    Oui désolé c'est une erreur de ma part lors de la rédaction du post.
    La fonction clock_second est issue d'un header qui lui incluait time.h, j'ai oublié de l'ajouter dans le post.
    Je corrige de suite.

    EDIT:
    J'ignorais que time() renvoyait un time_t, mais le problème n'est pas l'exécution du code. Mais, en ce qui concerne time(), qu'il me renvoi un entier, contrairement à clock(). Or j'ai besoin de cette précision.

  4. #4
    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 Maniack Crudelis Voir le message
    Mais, en ce qui concerne time(), qu'il me renvoi un entier, contrairement à clock(). Or j'ai besoin de cette précision.
    Tu veux mesurer des durées de quel ordre de grandeur ?

    De toutes façons, clock() sert à mesurer la consommation CPU et non la durée de type 'wall clock', ce que tu sais déjà. On ne peut donc pas utiliser clock() pour faire ce que tu veux.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 50
    Par défaut
    j'ai besoin de mesurer des durées de l'ordre du dixième de seconde tout au plus, puisque qu'il y à toujours un getchar() au milieu. Donc un appui sur une touche par l'utilisateur.
    La précision de clock() me convenait sur windows puisqu'il ne mesurait pas le temps processeur.

  6. #6
    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 Maniack Crudelis Voir le message
    j'ai besoin de mesurer des durées de l'ordre du dixième de seconde tout au plus,
    J'ai déjà indiqué une solution pour Linux...

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

Discussions similaires

  1. Non arrêt sur breakpoint
    Par Efcis dans le forum Eclipse C & C++
    Réponses: 0
    Dernier message: 11/12/2008, 01h45
  2. Arrêt sur un BeforePost
    Par looping dans le forum Langage
    Réponses: 1
    Dernier message: 23/04/2008, 18h22
  3. Réponses: 17
    Dernier message: 19/02/2008, 03h52
  4. mPlayer pour regarder arrêt sur images
    Par acryline dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 29/01/2007, 17h23
  5. Question sur getchar()
    Par _kal_ dans le forum C
    Réponses: 24
    Dernier message: 12/07/2006, 11h03

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