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 :

timing et loading en console


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut timing et loading en console
    Bonjour, je suis en train de tenter du programme expérimentale pour "m'amuser" les soirs d'été. J'essaye pour le moment de crée un programme reprenant un maximum de notion vu en cour et quelque truc vu sur internet.

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>   //bibli pour l'heure
    #include <unistd.h> //bibli pour sleep
    #include "sema.h"
     
    void clear() //nettoyer moba
    { 
    	 printf("\033[H\033[2J");   
    }
     
    int alea(int i) // renvoie un nombre compris entre 1 et i
    {
    	srand (time(NULL)*getpid());
    	int alea = rand()%i+1;
    return alea;
    }
     
    void chargement()
    {
    	int i,j;
    	for(i=0;i<100;)
    	{
    		clear();
    		printf("\nFichier Ecole");
    		printf("\n-------------");
    		printf("\t\n\n\nLoading....");
    		printf(" %d%",i);
    		j=alea(10);
    		i=i+j;
    		if(i>100) i=100;
    		sleep(1);
     
    	}
    }
     
    void horloge()
    {
    	time_t crt = time(NULL);
        char buf[20];
    	int infinie = 1;
     
    	while(infinie == 1)
    	{
        /* % I :
         * L'heure, sur 12 heures, sous forme de nombre décimal (entre 01 et 12).
         * % M :
         * La minute, sous forme de nombre décimal (00 à 59). .
         * %p
         * L'une des deux chaînes `AM' ou `PM' en fonction de l'heure, ou
         * la traduction de ces chaînes en fonctions de la localisation en cours.
         * Midi est traité comme `PM' et Minuit comme `AM'.
         */
        strftime(buf, sizeof(buf), "%I:%M %p\n", localtime(&crt));
        puts(buf);
    	sleep(59);
    	}
    }
     
    int main (void)
    {
     
    	chargement();
     
    	pid_t pid = fork;
    	if ((pid < 0) exit(1);				
    	if (pid == 0) horloge();
    	else (pid > 1)
    	{
    	sleep(80);
    	}
    return EXIT_SUCCESS;	
    }

    Comme on peut le voir je suhaite crée un faux "Loading" pour la forme. Il fonctionne mais lors de l'execution je n'ai droit que a:

    Loading...... sans les pourcentages, ils s'affichent mais il faut remonter voir plus haut pour les voirs. Pourtant le sleep fait que il devrait être visible 1 seconde.

    Mon second problème est au niveau de l'horloge. je souhaite crée une horloge constante qui durera tant que le programme est actif. Le programme final (j'en suis loin) me permettra d'afficher mes cours, écrire des notes,etc
    Mon but étant de m'entrainer et analyser mes erreurs
    (j'aurai surement plein de question par la suite)

    Merci


    P.S le code de la fonction horloge est repris d'internet car je ne savais pas du tout comment afficher l'heure (mais sa me semblait fun)

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonjour,

    ton code émet plusieurs messages de diagnostic quand tu le compiles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > gcc -Wall -Wextra -g -o horl horl.c 
    horl.c: In function ‘chargement’:
    horl.c:29:9: warning: spurious trailing ‘%’ in format [-Wformat]
    horl.c: In function ‘main’:
    horl.c:67:17: warning: initialization makes integer from pointer without a cast [enabled by default]
    horl.c:68:19: error: expected ‘)’ before ‘exit’
    horl.c:74:1: error: expected expression before ‘}’ token
    horl.c:74:1: warning: control reaches end of non-void function [-Wreturn-type]
    On va les reprendre
    • horl.c:29:9: warning: spurious trailing ‘%’ in format [-Wformat]qui est émis sur printf(" %d%",i);.
      Ici rien de grave, le compilateur te prévient juste d'une mauvaise utilisation de % dans le format du printf. En effet, comme % est utilisé comme un caractère marquant un traitement spécial il faut le doubler pour obtenir le caractère '%'
    • horl.c:67:17: warning: initialization makes integer from pointer without a cast [enabled by default] sur la ligne pid_t pid = fork;.
      Ici c'est grave : tu n'appelles pas la fonction fork, pour cela il faudrait un pid_t pid=fork();. Ce qui se passe ici c'est que si tu utilises fork comme une variable alors elle va représenter un pointeur sur une fonction, et provoque un warning qui t'indique que tu essayes de donner à un entier (pid_t est en fait un type entier) une valeur typée comme un pointeur.
    • horl.c:68:19: error: expected ‘)’ before ‘exit’ sur la ligne if ((pid < 0) exit(1);.
      Une erreur de parenthésage ... qui provoque également le message horl.c:74:1: error: expected expression before ‘}’ token car on atteint la fin du programme sans avoir pu fermer la parenthèse ouvrante de la ligne 68. Elle provoque aussi le warning horl.c:74:1: warning: control reaches end of non-void function [-Wreturn-type].


    Donc dans un premier il faut avoir un code qui compile
    Après la correction des erreurs précédentes on recompile et ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    > gcc -Wall -Wextra -g -o horl horl.c 
    horl.c: In function ‘main’:
    horl.c:70:14: warning: statement with no effect [-Wunused-value]
    horl.c:70:24: error: expected ‘;’ before ‘{’ token
    horl.c:74:1: warning: control reaches end of non-void function [-Wreturn-type]
    ... encore des erreurs.
    À la ligne else (pid > 1) { : tu utilises else (<condition>) au lieu de else if (<condition>).
    Les messages peuvent paraître obscurs mais ils s'expliquent simplement. Le premier warning (statement with no effect) parle de la partie (pid>1) qui est une expression valide C mais qui ne fait rien (=son absence ne modifie pas le résultat du programme). La seconde est due au if manquant, il y a une erreur car le compilateur trouve une accolade ouvrante et l'expression qui précède n'est pas terminée par un ;.

    On recorrige, on recompile : ça semble OK

    Tu as copié/collé le code tu testes ?

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Loading.... 100%07:59 AM
     
    07:55 AM
     
    07:59 AM
     
    07:55 AM
     
     100%bash-2.05$ 07:59 AM
     
    07:55 AM
    Voila la fin de l'output. A première vu mon horloge est pas à l'heure et bug un petit peu ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pid_t pid = fork();
    if (pid < 0) exit(1);				
    else if (pid == 0) horloge();
    else if (pid > 1)
    Je ne comprend pas pourquoi je dois utiliser un else if toute à la fin un else aurait suffi mais comme le compilateur grognait je n'ai pas eu d'autre choix.
    (Le compilateur gagne toujours )

    Concernant le loading toujours le même problème j'aimerai voir les 10%-15%, etc mais il ne s'affiche que indirectement

    voici après modif:

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>   //bibli pour l'heure
    #include <unistd.h> //bibli pour sleep
    #include "sema.h"
     
    void clear() //nettoyer moba
    { 
    	 printf("\033[H\033[2J");   
    }
     
    int alea(int i, int j) // renvoie un nombre compris entre 1 et i
    {
    	srand (time(NULL)*getpid());
    	int alea = rand()%i+j;
    return alea;
    }
     
    void chargement()
    {
    	int i,j;
    	for(i=0;i<100;)
    	{
    		clear();
    		printf("\nFichier Ecole");
    		printf("\n-------------");
    		printf("\t\n\n\nLoading....");
    		printf(" %d%%",i);  // %% permet d'afficher le caractère spécial % (doubler!)
    		j=alea(10,5);
    		i=i+j;
    		if(i>100) i=100;
    		sleep(1);
    	}
     
    		clear();
    		printf("\nFichier Ecole");
    		printf("\n-------------");
    		printf("\t\n\n\nLoading....");
    		printf(" 100%%");
    		sleep(2);
    }
     
    void horloge()
    {
    	time_t crt = time(NULL);
        char buf[20];
    	int infinie = 1;
     
    	while(infinie == 1)
    	{
        /* % I :
         * L'heure, sur 12 heures, sous forme de nombre décimal (entre 01 et 12).
         * % M :
         * La minute, sous forme de nombre décimal (00 à 59). .
         * %p
         * L'une des deux chaînes `AM' ou `PM' en fonction de l'heure, ou
         * la traduction de ces chaînes en fonctions de la localisation en cours.
         * Midi est traité comme `PM' et Minuit comme `AM'.
         */
        strftime(buf, sizeof(buf), "%I:%M %p\n", localtime(&crt));
        puts(buf);
    	sleep(59);
    	}
    }
     
    int main (void)
    {
     
    	chargement();
     
    	pid_t pid = fork();
    	if (pid < 0) exit(1);				
    	else if (pid == 0) horloge();
    	else if (pid > 1)
    	{
    	sleep(80);
    	}
    return EXIT_SUCCESS;	
    }
    Si vous connaissez une meilleur horloge je suis prenant et pour la suite du programme j'aimerai savoir si il est possible de combiner du c avec du script?
    Merci

  4. #4
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    Bonjour,

    Je ne comprend pas pourquoi je dois utiliser un else if toute à la fin un else aurait suffi mais comme le compilateur grognait je n'ai pas eu d'autre choix.
    (Le compilateur gagne toujours )
    Tu dois utiliser un else if car tu testes une condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(condition1) traitement1
    else if (condition2) traitement2
    else if (condition3) traitement3
    Pour utiliser le else seul, tu dois directement réaliser un traitement derrière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(condition1) traitement1
    else if (condition2) traitement2
    else traitement3
    Il faut le voir comme le traitement par défaut lorsque toutes tes conditions sont fausses.

    Cdlt, deletMe
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    Je me sens stupide tout d'un coup ^^'

  6. #6
    Membre confirmé
    Avatar de deletme
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 257
    Points : 519
    Points
    519
    Par défaut
    A force de bûcher sur un code, il peut arriver que ce genre d'erreur ne saute pas aux yeux . Une petite pause permet parfois de repartir du bon pied lol
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    - Martin Golding
    Traduction obligatoire : "Toujours écrire du code en gardant en tête que le mec qui en assurera la maintenance est un psychopathe violent qui connait votre adresse"

  7. #7
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Juste une petite remarque : ta cascade de if/else if ne traite pas le cas pid==1 (ce qui n'arrivera jamais a priori mais quand même ).
    Sinon si tu as plusieurs processus concurrents qui accèdent à la même ressource il vaut mieux en avoir un qui gère cette ressource et les autres qui communiquent avec lui. Par exemple si un des processus ne fait que positionner le curseur à un endroit puis afficher l'heure, et l'autre positionner le curseur à un autre endroit et afficher un avancement il va certainement y avoir des cas où le premier est interrompu après le positionnement du curseur, le second le place ailleurs affiche, on revient au premier qui affiche aussi ... mais au mauvais endroit.

    Dans ton cas ce serait sans doute plus simple d'utiliser des threads : un qui s'occupe de l'affichage (thread A), un pour le chargement du fichier (thread F), un autre pour afficher l'horloge (thread H) et le dernier ton thread printcipal (thread P). P commence par lancer A, puis H et finalement F. Ensuite il se met en attente de la fin de F pour poursuivre (par exemple). F et H communiquent avec A (via une file par exemple) en lui demandant d'afficher une chaine à un endroit. Comme il n'y a que A qui affiche tu n'auras pas les problèmes d'accès concurrents à l'affichage.

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 95
    Points : 41
    Points
    41
    Par défaut
    Je n'ai pas appris les thread. Je comptais faire la partie sur le c dans le tutoriel C (du moins jusqu'à un certain niveau). Je continuerais mon programme après ^^

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/03/2015, 14h03
  2. [Kylix] Kylix 3 C++ OE et fichier time.h
    Par Max13 dans le forum EDI
    Réponses: 7
    Dernier message: 30/10/2002, 14h55
  3. Réponses: 3
    Dernier message: 02/09/2002, 18h49
  4. Editeur en mode console
    Par logramme dans le forum C
    Réponses: 5
    Dernier message: 11/06/2002, 13h23

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