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 :

Problème avec timer


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut Problème avec timer
    J'ai réaliser un boggle en mode console sous linux.

    Je voudrais y intégrer un timer de 180s. Mais je me retrouve avec un décalage.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <time.h>
     
     
    int main(void)
    {
     
    printf (" \033[2J");
     
    int chrono = 0;
    int tempsPrecedent = 0, tempsActuel = 0;
    do
        {
          printf ("\033[1;6H");
          printf ("%d s\n", chrono);
          tempsActuel = clock ();
     
    printf("actuel %f\n\n",(double)tempsActuel/CLOCKS_PER_SEC);
    printf("temps precedent %f\n",(double)tempsPrecedent/CLOCKS_PER_SEC);
    printf("temps restant %f\n",(double)(tempsActuel - tempsPrecedent));
    printf("%ld secondes\n", tempsActuel/CLOCKS_PER_SEC);
     if ((double)(tempsActuel - tempsPrecedent) > 30)    /* Si 30 ms s'est écoulée */
        {
     
    tempsPrecedent = tempsActuel;
     
    }
            /* Le temps "actuel" devient le temps "precedent" pour nos futurs calculs */
     
          else          /* Si ça fait moins de 1 s depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
        {
     
    usleep (11 - (double)(tempsActuel - tempsPrecedent));
     
        }
     
        }
      while (tempsActuel/CLOCKS_PER_SEC<180);
     
    }
    Je pense que pour mon cas, je devrais me baser sur horloge temps reel.

    J'ai du mal a comprendre la fonction time, j'ai trouvé ceci: http://manpagesfr.free.fr/man/man7/time.7.html.

    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    À la ligne 41, tu divises une timestamp par CLOCKS_PER_SEC au lieu de diviser une durée.
    Et aussi, ton usleep est bizarre.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Je me suis basé sur ceci:

    fonction usleep: http://manpagesfr.free.fr/man/man3/usleep.3.html

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Moi je ne comprends pas pourquoi, pour comparer une soustraction de deux int avec 30, tu mets ça en double.
    Ni pourquoi tu fais un calcul en double alors que la fonction usleep() attend un int.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Voici le code complet:
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <time.h>
     
    #define dice 16
    #define face 6
    #define size_board 4
     
    int di, r, i, j = 0;
    char c;
    const char *grid[size_board][size_board];
    const char *de[dice][face] = {
      {"E", "H", "I", "S", "N", "R"},
      {"M", "S", "R", "I", "A", "O"},
      {"D", "C", "M", "P", "A", "E"},
      {"R", "C", "L", "S", "A", "E"},
      {"N", "U", "L", "E", "G", "Y"},
      {"E", "N", "O", "D", "T", "S"},
      {"S", "H", "E", "F", "E", "I"},
      {"F", "X", "R", "A", "O", "I"},
      {"I", "B", "A", "L", "T", "R"},
      {"E", "G", "I", "N", "T", "V"},
      {"Z", "E", "V", "A", "D", "N"},
      {"M", "A", "Q", "O", "B", "J"},
      {"U", "E", "O", "N", "T", "K"},
      {"P", "E", "L", "U", "T", "S"},
      {"W", "R", "L", "E", "V", "I"},
      {"O", "T", "A", "E", "I", "A"}
    };
     
    //fonction de generation grille de jeu
    int
    genergrid (int i, int j, int di, int r)
    {
     
    //si la grille est egale a zero
     
      if (grid[i - 1][j - 1] == NULL)
        {
     
    // on y met un dé de[di-1] avec une face [r-1]
     
          grid[i - 1][j - 1] = de[di - 1][r - 1];
     
    /*printf("%d", i);
    printf("%d\n", j);*/
     
          return 0;
     
        }
     
      else
        {
     
          i = rand () % 4 + 1;
          j = rand () % 4 + 1;
     
     
          genergrid (i, j, di, r);
        }
    }
     
     
     
    int
    getch (char c)
    {
      c = getchar ();
      if (c = getchar () != EOF)
        {
        }
      return 0;
    }
     
    int
    main (int argc, char *argv[])
    {
     
      printf (" \033[2J");
      srand (time (NULL));
     
      for (di = 1; di < dice + 1; di = di + 1)
        {
          int r = rand () % 6 + 1;
     
     
    /*printf("%s", de[di-1][r-1]);*/
     
          i = rand () % 4 + 1;
          j = rand () % 4 + 1;
     
          genergrid (i, j, di, r);
        }
     
      for (i = 1; i < 5; i = i + 1)
        {
          for (j = 1; j < 5; j = j + 1)
    	{
    	  printf ("\033[%d;%dH", i, j);
    	  printf ("%s", grid[i - 1][j - 1]);
    	  printf ("\n");
    	}
        }
     
     
    int chrono = 0;
    int tempsPrecedent = 0, tempsActuel = 0;
    do
        {
          printf ("\033[6;3H");
          printf ("%d s\n", chrono);
          tempsActuel = clock ();
     
    printf("actuel %ld\n\n",tempsActuel/CLOCKS_PER_SEC);
    printf("temps precedent %ld\n",tempsPrecedent/CLOCKS_PER_SEC);
    printf("temps restant %d\n",(tempsActuel - tempsPrecedent));
    printf("%ld secondes\n", tempsActuel/CLOCKS_PER_SEC);
     if ((tempsActuel - tempsPrecedent) > 30)	/* Si 30 ms s'est écoulée */
    	{ 
     
    tempsPrecedent = tempsActuel;
     
    }
    	 	/* Le temps "actuel" devient le temps "precedent" pour nos futurs calculs */
     
          else			/* Si ça fait moins de 1 s depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
    	{
     
    usleep (30 - (tempsActuel - tempsPrecedent));
     
    	}
     
        }
      while (tempsActuel/CLOCKS_PER_SEC<180);
     
     
     
     
      // printf ("fini");
      printf ("\e[?25l");
      getch (c);
      printf ("\e[?25h");
     
     
      return 0;
    }
    J'ai un probleme de decalage de secondes par rapport au nombres de secondes ecoulées normalement (heure ordinateur).

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ludovic787 Voir le message
    Voici le code complet:
    Ton code est illisible. Ton indentation est complètement innomable. Désolé mais la façon d'écrire un code traduit la façon dont on considère ce code. Un code pourri c'est un code dont on à rien à cirer et donc tu ne nous en voudras pas si nous aussi on n'en a rien à cirer.

    La seule chose que je peux dire (parce que la fonction est assez courte pour être lisible) c''est ici
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int getch (char c)
    {
    	c = getchar ();
    	if (c = getchar () != EOF)
    	{
    	}
    	return 0;
    }
    1. je ne comprends pas à quoi sert le paramètre "c"
    2. je ne comprends pas pourquoi un getchar() pour rien
    3. c=getchar() != EOF ne fonctionnera pas à cause des priorités des opérateurs (il faut écrire (c=getchar()) != EOF)
    4. les accolades vides sont inutiles (mets un point-virgule à la fin du if ())
    5. je ne comprends pas à quoi sert le return 0
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    pourtant j'ai utiliser la fonction indent de linux.

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <time.h>
     
    //declaration des variables
     
    #define dice 16
    #define face 6
    #define size_board 4
     
    int di, r, i, j = 0;
    char c;
    const char *grid[size_board][size_board];
    const char *de[dice][face] = {
      {"E", "H", "I", "S", "N", "R"},
      {"M", "S", "R", "I", "A", "O"},
      {"D", "C", "M", "P", "A", "E"},
      {"R", "C", "L", "S", "A", "E"},
      {"N", "U", "L", "E", "G", "Y"},
      {"E", "N", "O", "D", "T", "S"},
      {"S", "H", "E", "F", "E", "I"},
      {"F", "X", "R", "A", "O", "I"},
      {"I", "B", "A", "L", "T", "R"},
      {"E", "G", "I", "N", "T", "V"},
      {"Z", "E", "V", "A", "D", "N"},
      {"M", "A", "Q", "O", "B", "J"},
      {"U", "E", "O", "N", "T", "K"},
      {"P", "E", "L", "U", "T", "S"},
      {"W", "R", "L", "E", "V", "I"},
      {"O", "T", "A", "E", "I", "A"}
    };
     
    //fonction de generation grille de jeu
    int genergrid (int i, int j, int di, int r)
    {
     
    //si la grille est egale a zero
     
      if (grid[i - 1][j - 1] == NULL)
        {
     
    // on y met un dé de[di-1] avec une face [r-1]
     
          grid[i - 1][j - 1] = de[di - 1][r - 1];
     
    /*printf("%d", i);
    printf("%d\n", j);*/
     
          return 0;
     
        }
     
      else
        {
     
          i = rand () % 4 + 1;
          j = rand () % 4 + 1;
     
     
          genergrid (i, j, di, r);
        }
    }
     
     
    // fonction principale
    int main (int argc, char *argv[])
    {
     
    //tire aleatoirement une face pour chaque dé
      printf (" \033[2J");
      srand (time (NULL));
     
      for (di = 1; di < dice + 1; di = di + 1)
        {
          int r = rand () % 6 + 1;
     
     
    /*printf("%s", de[di-1][r-1]);*/
     
          i = rand () % 4 + 1;
          j = rand () % 4 + 1;
     
          genergrid (i, j, di, r);
        }
     
    //affiche la grille de 4x4 pour chaque face de dé
     
      for (i = 1; i < 5; i = i + 1)
        {
          for (j = 1; j < 5; j = j + 1)
    	{
    	  printf ("\033[%d;%dH", i, j);
    	  printf ("%s", grid[i - 1][j - 1]);
    	  printf ("\n");
    	}
        }
     
     
      int chrono = 0;
      int tempsPrecedent = 0, tempsActuel = 0;
      do
        {
          printf ("\033[6;3H");
          printf ("%d s\n", chrono);
          tempsActuel = clock ();
     
          printf ("actuel %ld\n\n", tempsActuel / CLOCKS_PER_SEC);
          printf ("temps precedent %ld\n", tempsPrecedent / CLOCKS_PER_SEC);
          printf ("temps restant %d\n", (tempsActuel - tempsPrecedent));
          printf ("%ld secondes\n", tempsActuel / CLOCKS_PER_SEC);
          if ((tempsActuel - tempsPrecedent) > 30)	/* Si 30 ms s'est écoulée */
    	{
     
    	  tempsPrecedent = tempsActuel;
     
    	}
          /* Le temps "actuel" devient le temps "precedent" pour nos futurs calculs */
     
          else			/* Si ça fait moins de 1 s depuis le dernier tour de boucle, on endort le programme le temps qu'il faut */
    	{
     
    	  usleep (30 - (tempsActuel - tempsPrecedent));
     
    	}
     
        }
      while (tempsActuel / CLOCKS_PER_SEC < 180);
     
     
     
     
      return 0;
    }

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ludovic787 Voir le message
    pourtant j'ai utiliser la fonction indent de linux.
    Probablement une option que tu n'as pas mise. Il y en a tellement... Et comme je ne connais pas en détail (je l'utilise jamais)...

    Revenons à ton code. Bon, déjà utiliser la récursivité pour remplir une matrice... Sans déconner quoi. peut pas simplement faire deux boucles ??? Et en plus ça ne remplit même pas la matrice entièrement car ça quitte si le truc (qui tape au hasard) tombe sur une case non nulle. Et on n'utilise pas NULL pour les entiers car NULL c'est un pointeur (oui, c'est 0 casté en char *). Donc ça entraine deux casts qui s'annulent au résultat mais qui sont quand-même exécutés.
    Pour tester 0 on teste 0.

    Et pour ton décalage je ne comprends pas ce que tu fais avec ton truc qui va de 30 en 30. Ca ne te cale alors pas sur la minute (ou les 3 minutes avec ton 180) mais ça te garantit juste que tu vas attendre au-moins 30 secondes. Mais ça n'empêche pas ton programme d'attendre par exemple 35 ou 40 secondes quoi...

    Si tu veux un timer de 180s, pourquoi tu n'attends pas simplement 180s ???

    Autre chose: on n'utilise pas le modulo pour de l'aléatoire car ça ne te donne pas un aléa uniformément distribué. Il vaut mieux diviser rand() par RAND_MAX (ce qui te donne un nombre entre 0 et 1 s'étalant de façon uniforme sur toute la gamme qui sépare ces deux valeurs) puis le multiplier par le nombre à atteindre. Bon ça c'est quand on veut être vraiment super précis donc c'est pas primordial.

    Et utiliser des globales c'est mal. Surtout pour des trucs aussi bateau que des variables de boucle quoi.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Revenons à ton code. Bon, déjà utiliser la récursivité pour remplir une matrice... Sans déconner quoi. peut pas simplement faire deux boucles ??? Et en plus ça ne remplit même pas la matrice entièrement car ça quitte si le truc (qui tape au hasard) tombe sur une case non nulle. Et on n'utilise pas NULL pour les entiers car NULL c'est un pointeur (oui, c'est 0 casté en char *). Donc ça entraine deux casts qui s'annulent au résultat mais qui sont quand-même exécutés.
    Pour tester 0 on teste 0.
    J'ai utilisé la recursivité pour remplir ma matrice( je trouvais cela qui coulait de source) , car mon but etait de simuler le tirage de dé et de placer aleatoirement. Car avec les deux boucles je ne vois pas comment faire pour remplir la matrice de facon aleatoire.

    Et pour ton décalage je ne comprends pas ce que tu fais avec ton truc qui va de 30 en 30. Ca ne te cale alors pas sur la minute (ou les 3 minutes avec ton 180) mais ça te garantit juste que tu vas attendre au-moins 30 secondes. Mais ça n'empêche pas ton programme d'attendre par exemple 35 ou 40 secondes quoi...

    Si tu veux un timer de 180s, pourquoi tu n'attends pas simplement 180s ???
    meme si je fais une duree de 180s , j'ai un decalage de plusieurs minutes( quand mon 180s est ecoulé equivaut à environ (niveau horloge ordi: environ 8 min).

    le truc qui va de 30 en 30 c'est pour eviter que le CPU tourne a 100% pendant 3min.

    Autre chose: on n'utilise pas le modulo pour de l'aléatoire car ça ne te donne pas un aléa uniformément distribué. Il vaut mieux diviser rand() par RAND_MAX (ce qui te donne un nombre entre 0 et 1 s'étalant de façon uniforme sur toute la gamme qui sépare ces deux valeurs) puis le multiplier par le nombre à atteindre. Bon ça c'est quand on veut être vraiment super précis donc c'est pas primordial.
    je ne savais pas que le modulo ne donnait pas un aléa uniformément distribué.

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Déjà, quel est ton objectif pour le timer?
    • Simplement un compte à rebours de 180 secondes, qui affiche un message à chaque seconde? Plutôt facile.
    • Un compte à rebours qui permet de saisir des mots pendant ce temps-là? Super-compliqué, nécessite probablement d'utiliser pdcurses pour recoder complètement la saisie au clavier de manière interrompue par le compteur. Ou peut-être simplement du multi-thread avec un signal, ou un select()? Dans tous les cas, pas une partie de plaisir.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ludovic787 Voir le message
    J'ai utilisé la recursivité pour remplir ma matrice( je trouvais cela qui coulait de source) , car mon but etait de simuler le tirage de dé et de placer aleatoirement. Car avec les deux boucles je ne vois pas comment faire pour remplir la matrice de facon aleatoire.
    La récursivité ça a l'air sympa sur le papier (on se rappelle et hop c'est réglé !) mais t'as pas idée de ce que ça entraine comme charge. Si tu veux remplir toute la matrice avec une valeur aléatoire
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i=0; i < lig; i++) {
    	for (j=0; j < col; j++)
    		mat[i][j]=rand();
    }

    Et si tu veux remplir n éléments aléatoires de la matrice avec une valeur aléatoire
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (i=0; i < n; i++) {
    	while (1) {
    		lig=rand();
    		col=rand();
    		if (mat[lig][col] == 0) break;
    	}
    	mat[lig][col]=rand();
    }

    Citation Envoyé par ludovic787 Voir le message
    je ne savais pas que le modulo ne donnait pas un aléa uniformément distribué.
    C'est expliqué sur le net mais bon, c'est pas important pour l'instant. Pour l'instant essaye de répondre aux questions de Médinoc...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Medinoc:

    Mon objectif est est tout simplement de faire un compte à rebours de 180 secondes, qui affiche un message à chaque seconde

    Et merci à Sve@r, pour ton explication sur la récursivité.

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ludovic787 Voir le message
    Mon objectif est est tout simplement de faire un compte à rebours de 180 secondes, qui affiche un message à chaque seconde
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    #include <unistd.h>
     
    void rebours(int n) {
    	while (n--) {
    		printf("Hello %d\n", n);
    		sleep(1);
    	}
    }
     
    int main() {
    	rebours(10);
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 70
    Points : 45
    Points
    45
    Par défaut
    Merci Sve@r, cela 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
     
    #include <stdio.h>
    #include <unistd.h>
     
    void rebours(int n) {
    	while (n--) {
    		printf ("\033[6;3H");		
    		printf(" %d s\n", n);
    		sleep(1);
    		printf (" \033[2J");
    	}
    }
     
    int main() {
    	rebours(180);
    }
    je n'ai plus qu'a intégrer dans la fonction rebours l'affichage de la grille de 4x4

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Et si tu veux remplir n éléments aléatoires de la matrice avec une valeur aléatoire
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (i=0; i < n; i++) {
    	while (1) {
    		lig=rand();
    		col=rand();
    		if (mat[lig][col] == 0) break;
    	}
    	mat[lig][col]=rand();
    }
    Ce remplissage aléatoire a ses inconvénients, surtout quand n se rapproche de la taille de mat voire l'atteint. D'ailleurs, sur au moins une plate-forme, l'emploi d'un rand() modulo au lieu d'une division flottante par RAND_MAX+1 m'a donné une boucle infinie, car l'implémentation alternait systématiquement les valeurs paires et impaires, au point que seule la moitié de ma matrice pouvait être touchée!

    Pour le cas actuel, il vaudrait mieux cloner la liste de dés et faire un fisher-yates shuffle sur le clone avant de recopier dans la matrice (note: on pourrait faire ça directement sur la matrice mais ça rend le code moins compréhensible).

    Code C : 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
    int rand0Nmoins1(int n)
    {
    	return (int)(rand() / (RAND_MAX+1.0) * n);
    }
     
    void permuterDeuxDesJetes(const char *desJetes[], size_t i, size_t j)
    {
    	const char * tmp = desJetes[i];
    	assert(i < dice);
    	assert(j < dice);
    	desJetes[i] = desJetes[j];
    	desJetes[j] = tmp;
    }
     
    void remplir_matrice(const char *matrice[size_board][size_board], const char * const tousLesDes[dice][face])
    {
    	const char * desJetes[dice];
    	size_t i;
    	for(i=0 ; i<dice ; i++)
    		desJetes[i] = tousLesDes[i][rand0Nmoins1(6)];
     
    	//Fisher-yates shuffle
    	for(i=0 ; i<dice-1 ; i++) //dice-1 parce que pas la peine de faire un jet pour le dernier: ce serait prendre 1 aléatoirement parmi 1
    	{
    		size_t j = i + rand0Nmoins1(dice-i); //On choisit un emplacement parmi ceux pas encore traités (y compris l'actuel)
    		permuterDeuxDesJetes(desJetes, i, j); //On permute avec l'emplacement actuel
    	}
     
    	//Plus qu'à remplir la matrice
    	for(i=0 ; i<dice && i<(size_board*size_board) ; i++)
    		matrice[ i/size_board ][ i%size_board ] = desJetes[i];
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ce remplissage aléatoire a ses inconvénients, surtout quand n se rapproche de la taille de mat voire l'atteint.
    C'était juste pour donner l'idée de départ. Effectivement cet algo part du principe que "n" reste faible devant "mat" et l'utiliser pour remplir toute la matrice risque effectivement d'être très long (tout comme esasyer d'obtenir un mot du dico en faisant tirer des lettres au hasard).

    Après donc effectivement on peut trouver d'autres techniques mais qui dépendent surtout du pourcentage de l'espace à remplir.

    Citation Envoyé par Médinoc Voir le message
    D'ailleurs, sur au moins une plate-forme, l'emploi d'un rand() modulo au lieu d'une division flottante par RAND_MAX+1 m'a donné une boucle infinie, car l'implémentation alternait systématiquement les valeurs paires et impaires, au point que seule la moitié de ma matrice pouvait être touchée!
    T'as dû avoir les boules quand t'as compris
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  17. #17
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    C'est ce qui m'a finalement fait passer à la division: Avant, je n'avais encore jamais eu de problèmes avec le modulo, et le "biais" qu'il introduit est insignifiant pour, par exemple, un D6: RAND_MAX valant au minimum 32767, ça veut juste dire que le 1 a 5462 chances de sortir alors que les autres en ont 5461!
    Puis j'ai eu ce problème, et constaté enfin pourquoi le prof préconisait de passer par la division et les nombres à virgule flottante. Humble pie.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. problème avec timer
    Par lokardz dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/05/2009, 16h05
  2. Problème avec timers
    Par window62123 dans le forum C#
    Réponses: 14
    Dernier message: 08/04/2009, 16h46
  3. [C++/CLI] problème avec Timer ou delegate
    Par breezer911 dans le forum Visual C++
    Réponses: 1
    Dernier message: 11/04/2007, 15h27
  4. [D6] Problème avec timers
    Par dridri86 dans le forum Delphi
    Réponses: 5
    Dernier message: 15/01/2007, 13h57
  5. Toujours un problème avec Timer
    Par adidas40 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 10/10/2006, 11h04

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