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 :

Compte à rebours avec affichage


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Points : 47
    Points
    47
    Par défaut Compte à rebours avec affichage
    Bonsoir à tous,

    Et bien cet fois-ci, c est un compte à rebours que j essaie de coder avec affichage dans la console. Ce que j aimerai au final, c est que la phrase "Il vous reste %ld secondes" s affiche avec seulement le chiffre qui decremente.

    Pour l instant j ai codé ceci:

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <unistd.h>
     
    int main(int argc, char *argv[])
    {
     
        for( i = 60; i != 0; i--)
     {
        printf("Il vous reste %ld secondes.\n", i);
        sleep(1);
         system ("clear");
     
     }
    return EXIT_SUCCESS;
    }
    Alors pour l instant je suis loin du but recherché car le probleme c est que le system("clear") me fait des saut de lignes impressionnant surement du au \n dans le printf , et en plus toute la phrase se reaffiche (60 fois). Alors j ai viré le system ("clear") pour commencer.

    J utilise kdevelop sous linux, ce qui explique (si j ai bien lu) que j utilise #include <unistd.h> et le system("clear").

    Pourriez vous me donner un petit coups de main.

    Cordialement Shaz

  2. #2
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      for( i = 60; i != 0; i--)
    Le "i" n'est pas déclaré dans ta fonction main ! Comment fais tu pour compiler ça?

    Chez moi, il ne reconnait pas non plus la fonction "sleep", mais je n'utilise pas le même logiciel que toi.

  3. #3
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    En cherchant un peu, j'ai trouvé une fonction sleep, qui devrait te permettre de faire ce que tu veux.
    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
     
    #include <stdlib.h>
    #include <time.h>
     
    void sleep(int nbr_seconds)
    {
    	clock_t goal;
    	goal = (nbr_seconds * CLOCKS_PER_SEC) + clock();
    	while(goal > clock())
    	{
    		;
    	}
    } 
     
    int main(int argc, char *argv[])
    {
         int i;
        for( i = 60; i != 0; i--)
     {
        printf("Il vous reste %ld secondes.\n", i);
        sleep(1);
     
     
     
     }
    return EXIT_SUCCESS;
    }

  4. #4
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Points : 47
    Points
    47
    Par défaut
    Bonsoir Climoo,

    Effectivement tu as raison j avais oublier de marquer la variable i.(petit oubli)

    J ai essayer ton code , mais il me donne la meme chose que le mien (sans le system("cls") et avec la variable i ).

    J ai meme dû enlever ta fonction sleep car le compilateur m a gentillement dit, quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/include/unistd.h:405: error: previous declaration of 'sleep' was here
    . J ai cru comprendre que ta fonction etait celle déjà inclus dans unistd.h.(????)

    D autres idées sont les biens venus.

    Cordialement
    Shaz

  5. #5
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par shazad Voir le message
    Pour l instant j ai codé ceci:
    Ton code est incomplet...
    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
     
     
    -------------- Build: Debug in hello ---------------
     
    Compiling: main.c
    Linking console executable: bin\Debug\hello.exe
    C:\dev\hello\main.c: In function `main':
    C:\dev\hello\main.c:9: error: `i' undeclared (first use in this function)
    C:\dev\hello\main.c:9: error: (Each undeclared identifier is reported only once
    C:\dev\hello\main.c:9: error: for each function it appears in.)
    C:\dev\hello\main.c:12: warning: implicit declaration of function `sleep'
    C:\dev\hello\main.c: At top level:
    C:\dev\hello\main.c:6: warning: unused parameter 'argc'
    C:\dev\hello\main.c:6: warning: unused parameter 'argv'
    Process terminated with status 1 (0 minutes, 0 seconds)
    3 errors, 3 warnings
    Ceci fonctionne. Pose des questions si tu ne comprends pas.
    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
     
    #include <stdio.h>
     
    /* http://delahaye.emmanuel.free.fr/clib/ */
    #include "psleep/inc/psleep.h"
     
    int main (void)
    {
       int i;
       for (i = 60; i != 0; i--)
       {
          printf ("\rIl vous reste %2d secondes.", i);
          fflush (stdout);
          msleep (1000);
       }
       return 0;
    }

  6. #6
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Points : 47
    Points
    47
    Par défaut
    Bonjour Emmanuel,

    Et comme d habitude c est parfait, tout fonctionne.

    Alors voilà ce que je comprends:

    Le fichier psleep.h je pense que c est pour la portabilité du code , que ce soit sous windows ou linux j aurai le bon header pour faire fonctionner la fonction sleep().

    Pour la fonction fflush() j ai lu qu elle forcer l ecriture des données se trouvant dans le buffer, alors la j avoue que je me demande pourquoi il faut forcer l ecriture (????). j ai fait un seul essai en l enlevant et le code fonctionne tout de même, mais il y a forcément une bonne raison a sa présence.

    Et donc la fonction msleep() qui permet de faire en sorte que mon for ne se deroule pas en 1/100 de secondes.

    Ah et oui le \r qui m enpêche certainement de faire des sauts de lignes mais plutot de rester sur la même ligne.

    Je te remercis encore.
    Shaz

  7. #7
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par shazad Voir le message
    Alors voilà ce que je comprends:

    Le fichier psleep.h je pense que c est pour la portabilité du code , que ce soit sous windows ou linux j aurai le bon header pour faire fonctionner la fonction sleep().
    Oui, 'p' comme portable.

    Pour la fonction fflush() j ai lu qu elle forcer l ecriture des données se trouvant dans le buffer, alors la j avoue que je me demande pourquoi il faut forcer l ecriture (????). j ai fait un seul essai en l enlevant et le code fonctionne tout de même, mais il y a forcément une bonne raison a sa présence.
    Oui, c'est parce que la ligne n'est pas terminée par un '\n' :

    http://emmanuel-delahaye.developpez....#fflush_stdout


    Et donc la fonction msleep() qui permet de faire en sorte que mon for ne se deroule pas en 1/100 de secondes.
    mais en 1000 millième, soit 1 seconde...

    Ah et oui le \r qui m enpêche certainement de faire des sauts de lignes mais plutot de rester sur la même ligne.
    Oui. Le '\r' est le code de CR (carriage return ou retour chariot. : ramène le curseur en début de ligne sans sauter de ligne.

  8. #8
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Points : 47
    Points
    47
    Par défaut
    Bonjour Emmanuel,

    Merci encore pour tes lumières , des que je peus aller voir le lien sur la fonction fflush() je vais regarder ça, je suis au boulot, je vais regarder ça ce soir.

    Cordialement

    Shaz

  9. #9
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par shazad Voir le message
    Hier un pingouin a frappé a ma fenêtre, il a frappé si fort qui il l'a cassée; et alors la je me suis senti libre ...
    Joli !

  10. #10
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ceci fonctionne. Pose des questions si tu ne comprends pas.
    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
     
    #include <stdio.h>
     
    /* http://delahaye.emmanuel.free.fr/clib/ */
    #include "psleep/inc/psleep.h"
     
    int main (void)
    {
       int i;
       for (i = 60; i != 0; i--)
       {
          printf ("\rIl vous reste %2d secondes.", i);
          fflush (stdout);
          msleep (1000);
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /home/nicolas/SunStudioProjects/Application_6/newfile.c:11: undefined reference to `msleep'

  11. #11
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /home/nicolas/SunStudioProjects/Application_6/newfile.c:11: undefined reference to `msleep'
    Et ? Même le P.O. a compris ce qu'il fallait faire...

  12. #12
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Et ? Même le P.O. a compris ce qu'il fallait faire...
    Comportement indéterminé.

  13. #13
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Comportement indéterminé.
    Pourquoi ? Tu ne sais plus cliquer sur un lien, télécharger du code source... ?

    Qu'est-ce que tu veux démontrer ?

  14. #14
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Pourquoi ? Tu ne sais plus cliquer sur un lien, télécharger du code source... ?

    Qu'est-ce que tu veux démontrer ?
    C'est bien avec ton code source que j'obtiens ce warning. Pour éviter le comportement indéterminé, et le warning par la même occasion, il faut écrire:
    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
    #define _XOPEN_SOURCE 700
    #include <stdio.h>
    #include "psleep/inc/psleep.h"
     
    int main (void)
    {
       unsigned i;
       for (i = 60; i != 0; i--)
       {
          printf ("\rIl vous reste %2u secondes.", i);
          fflush (stdout);
          msleep (1000);
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef H_ED_PSLEEP
    #define H_ED_PSLEEP
     
    #if defined (WIN32)
    # include <windows.h>
    # define msleep(ms) Sleep(ms)
    #elif defined (__linux) || defined (linux)
    # include <unistd.h>
    # define msleep(ms) usleep((ms) * 1000)
    #endif
     
    #endif /* guard */

  15. #15
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    160
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 160
    Points : 47
    Points
    47
    Par défaut Reponse à Emmanuel
    Merci pour ton compliment, j ai mis du temps a me trouver une phrase pas trop con.

    Ah et oui je voulais juste ajouter que si j essai avec sleep(1), ca ne marche pas avec code block sous windows ( pc du travail), mais ca fonctionne avec kdevelop sous linux.(a la maison)
    Pourquoi svp.

    Cordialement

    Shaz

  16. #16
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par shazad Voir le message
    Merci pour ton compliment, j ai mis du temps a me trouver une phrase pas trop con.

    Ah et oui je voulais juste ajouter que si j essai avec sleep(1), ca ne marche pas avec code block sous windows ( pc du travail), mais ca fonctionne avec kdevelop sous linux.(a la maison)
    Pourquoi svp.

    Cordialement

    Shaz
    Il n'y a pas de fonction sleep() (POSIX) sous Windows.

  17. #17
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    C'est bien avec ton code source que j'obtiens ce warning. Pour éviter le comportement indéterminé, et le warning par la même occasion, il faut écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define _XOPEN_SOURCE 700
    Ca, c'est un problème de configuration de l'environnement de dévéloppement, pas de code source. Par contre pour les defined() supplémentaires, c'est OK :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef H_ED_PSLEEP
    #define H_ED_PSLEEP
     
    #if defined (WIN32)  || defined (_WIN32)
    # include <windows.h>
    # define msleep(ms) Sleep(ms)
    #elif defined (__linux) || defined (linux)
    # include <unistd.h>
    # define msleep(ms) usleep((ms) * 1000)
    #endif
     
    #endif /* guard */
    Correction faite sur le serveur.

  18. #18
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ca, c'est un problème de configuration de l'environnement de dévéloppement, pas de code source.
    Le seul moyen de défnir une macro de manière portable, c'est dans le source et tu le sais bien. Moi mes codes marchent avec tous les compilateurs.

  19. #19
    Expert éminent sénior
    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
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Le seul moyen de définir une macro de manière portable, c'est dans le source et tu le sais bien. Moi mes codes marchent avec tous les compilateurs.
    Non. Cette macro dépend de l'environnement. Elle ne peut pas faire partie du code source.

    Elle doit donc être définie dans le makefile avec un -Dmymacro (ou équivalent).

    Chez moi, dans mon Code::Blocs sous Windows, j'ai :

    'defines' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    BLK_ADT=1
    DBG_SYSALLOC
    FIFO_DYN
    _WIN32_WINNT=0x0501
    en configuration générale commune à tous les projets.

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

Discussions similaires

  1. [débutant] compte à rebours avec changement d'image
    Par ravid87 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 31/03/2011, 12h41
  2. Une histoire de compte à rebours (avec formulaire)
    Par Olivier14 dans le forum Général JavaScript
    Réponses: 18
    Dernier message: 04/03/2009, 14h43
  3. probleme d'affichage d'un compte à rebours
    Par Invité dans le forum Access
    Réponses: 6
    Dernier message: 16/03/2008, 14h51
  4. Petit compte à rebours avec PHP.
    Par Trinout dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 10/09/2007, 17h06
  5. Compte à rebours avec Timer
    Par womannosky dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 13/06/2007, 19h33

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