Partage
  • Partager sur Facebook
  • Partager sur Twitter

petite erreur dans "À l'assaut des pointeurs".

petit oubli lors de recalcul du nombre d'heures dans l'exemple.

    9 mai 2019 à 7:48:27

    Bonjour!

    Je suis ici pour attirer l'attention sur ce qui me semble être une petite erreur:

    Dans le chapitre 'à l'assaut des pointeurs', Le nombre d'heures actuel n'est pas pris en quand le recalcule le nombre d'heures. En effet, la fonction qui sert comme fil rouge dans ce chapitre se contente de redéfinir "heures" comme le nombre de minutes modulo soixante:

    *heures = *minutes / 60;

    Or, pour bien faire marcher la fonction, ce nombre devrait être ajouté et "heures" ne devrait pas être remplacé par lui.Voici donc la ligne de code telle qu'elle aurait dû être à mon avis:

    *heures += *minutes / 60;

    Notez bien qu'il faut mettre ce "+" à deux endroits, c'est à dire dans au début et à la fin du chapitre.

    J'espère que cela peut être corrigé parce que ce chapitre est tellement bien écrit en dehors de cette petite erreur. À mon avis vous méritez bien quelques plus de plus!

    (Bravo, tenez le cap!)

    • Partager sur Facebook
    • Partager sur Twitter
      9 mai 2019 à 12:40:39

      Si je parle de ce code là qui est à la fin du chapitre

      void decoupeMinutes(int* pointeurHeures, int* pointeurMinutes);
      
      int main(int argc, char *argv[])
      {
          int heures = 0, minutes = 90;
      
          // On envoie l'adresse de heures et minutes
          decoupeMinutes(&heures, &minutes);
      
          // Cette fois, les valeurs ont été modifiées !
          printf("%d heures et %d minutes", heures, minutes);
      
          return 0;
      }
      
      void decoupeMinutes(int* pointeurHeures, int* pointeurMinutes)
      {
          /* Attention à ne pas oublier de mettre une étoile devant le nom
          des pointeurs ! Comme ça, vous pouvez modifier la valeur des variables,
          et non leur adresse ! Vous ne voudriez pas diviser des adresses,
          n'est-ce pas ? ;o) */
          *pointeurHeures = *pointeurMinutes / 60;
          *pointeurMinutes = *pointeurMinutes % 60; 
      }

      Tout dépend de ta spécification ! Qui te dit que tu es sensé prendre en compte la variable heures ?

      Il faut alors lire le "fil rouge", qui est :

      > Supposons que je veuille écrire une fonction à laquelle on envoie un nombre de minutes. Celle-ci renverrait le nombre d'heures et minutes correspondantes 

      Le problème initial était donc le suivant : écrire une fonction qui "renvoie" le nombre d'heures et de minutes à partir d'un nombre de minutes

      Le langage C n'a pas de moyen syntaxique d'exprimer ça (au contraire de certains langages comme Ada), mais en terme informatique, on dit que pointeurHeures est une sortie de la fonction, et pointeurMinutes est une entrée-sortie

      Bref, tout ça pour dire que la fonction écrire par l'auteur est correcte vis-à-vis de sa spécification. On aurait très bien pu avoir une autre spécification et une autre fonction, mais ça c'est un choix de conception du tutoriel.

      -
      Edité par potterman28wxcv 9 mai 2019 à 12:41:52

      • Partager sur Facebook
      • Partager sur Twitter
        9 mai 2019 à 13:56:10

        potterman28wxcv a écrit:

        > Supposons que je veuille écrire une fonction à laquelle on envoie un nombre de minutes. Celle-ci renverrait le nombre d'heures et minutes correspondantes 

        Le problème initial était donc le suivant : écrire une fonction qui "renvoie" le nombre d'heures et de minutes à partir d'un nombre de minutes

        Le langage C n'a pas de moyen syntaxique d'exprimer ça


        Bien sur que si

        struct Duree {
           int heures;
           int minutes;
        };
        
        
        struct Duree conversion(int minutes) {                     // edit. Voir plus loin
            struct Duree { .heures = minutes / 60, .minutes = minutes % 60 } d;
            return d;
        }
        
        



        -
        Edité par michelbillaud 11 mai 2019 à 19:23:30

        • Partager sur Facebook
        • Partager sur Twitter
          9 mai 2019 à 14:27:04

          Sauf que le chapitre des structures n'est pas encore passé de mémoire. Par contre oui c'est mieux
          • Partager sur Facebook
          • Partager sur Twitter
            9 mai 2019 à 14:37:41

            michelbillaud a écrit:

            potterman28wxcv a écrit:

            > Supposons que je veuille écrire une fonction à laquelle on envoie un nombre de minutes. Celle-ci renverrait le nombre d'heures et minutes correspondantes 

            Le problème initial était donc le suivant : écrire une fonction qui "renvoie" le nombre d'heures et de minutes à partir d'un nombre de minutes

            Le langage C n'a pas de moyen syntaxique d'exprimer ça


            Bien sur que si

            struct Duree {
               int heures;
               int minutes;
            };
            
            
            struct Duree conversion(int minutes) {
                struct Duree {
                   .heures  = minutes / 60,
                   .minutes = minutes % 60
                } d;
                return d;
            }
            
            



            -
            Edité par michelbillaud il y a 35 minutes

            Je voulais dire : le C n'a pas de moyen syntaxique d'indiquer qu'un pointeur argument représente une donnée d'entrée ou de sortie.

            -
            Edité par potterman28wxcv 9 mai 2019 à 16:37:16

            • Partager sur Facebook
            • Partager sur Twitter
              9 mai 2019 à 16:51:36

              Hello,

              potterman28wxcv a écrit:

              Mais oui je n'ai pas assez précisé : le C n'a pas de moyen syntaxique d'indiquer qu'un pointeur argument représente une donnée d'entrée ou de sortie.


              Non, pas de base. Mais tu peux toujours utiliser des #define:
              #define _in_
              #define _out_
              #define _in_out_
              
              void ....(_in_out_ int *minutes, _out_ int *hours) {
              

              (je sais, les _ sont normalement réservés pour le compilateur)

              Mais est-ce nécessaire ? Un commentaire avant la fonction devrait suffire.

              -
              Edité par edgarjacobs 9 mai 2019 à 16:52:41

              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                9 mai 2019 à 16:57:11

                Oui une bonne documentation résout le problème
                • Partager sur Facebook
                • Partager sur Twitter
                  9 mai 2019 à 18:04:14

                  void aUselessFunction(
                     Point * child, //<[out] relative position from parent
                     Point * parent //<[in] parent position
                  )
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 mai 2019 à 23:52:42

                    Salut,

                    Ne serait-il pas plus propre d'utiliser les commentaires doxy ? Cela permet d'avoir accès à la description d'une fonction et de ses arguments lors de la frappe :

                    Les commentaires de lignes, bien qu'utiles à la description de ce que l'on cherche à faire, nécessitent de se rendre à la ligne de déclaration.

                    C'est du boulot, mais ça vaut le coût quand le nombre de fonction devient conséquent.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Bonhomme !! | Jeu de plateforme : Prototype.

                      11 mai 2019 à 0:22:49

                      michelbillaud a écrit:

                      Bien sur que si

                      Bonsoir, ton code ne compilait pas, peut-être voulais-tu ceci:

                      #include <stdio.h>
                      
                      struct Duree {
                      	int heures;
                      	int minutes;
                      };
                      
                      struct Duree conversion(int minutes) {
                      	return (struct Duree) {
                      		.heures  = minutes / 60,
                      		.minutes = minutes % 60
                      	};
                      }
                      
                      int main(void)
                      {
                      	struct Duree d = conversion(93);
                      	printf("%d:%d\n", d.heures, d.minutes);
                      	return 0;
                      }
                      




                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 mai 2019 à 19:18:23

                        Voila ce que c'est de poster sans tester.

                        Pendant que j'y suis :

                        struct Duree {
                            unsigned int heures;
                            unsigned int minutes;
                        };
                         
                        struct Duree minutesVersDuree(unsigned int minutes) {
                            return (struct Duree) {
                                .heures  = minutes / 60,
                                .minutes = minutes % 60
                            };
                        }


                        l'opérateur % étant à manipuler avec des pincettes pour des nombres négatifs (non, c'est pas modulo).

                        • Partager sur Facebook
                        • Partager sur Twitter

                        petite erreur dans "À l'assaut des pointeurs".

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown