Partage
  • Partager sur Facebook
  • Partager sur Twitter

À l'assaut des pointeurs

Mal compris... comment fonctionne la fonction decoupeMinutes

    21 juin 2020 à 23:55:28

    Bonjour,

    Les arguments heures et minutes ont les valeurs 0 et 90,comment l'affectation se déroule dans le block de la fonction decoupeMinutes ?? Pourquoi lors de l'exucution de la fonction la valeur de heures =1 et minutes =30;

    #include <stdio.h>
    #include <stdlib.h>
    
    /* Je mets le prototype en haut. Comme c'est un tout
    petit programme je ne le mets pas dans un .h, mais
    en temps normal (dans un vrai programme), j'aurais placé
    le prototype dans un fichier .h bien entendu */
    
    void decoupeMinutes(int heures, int minutes);
    
    int main(int argc, char *argv[])
    {
        int heures = 0, minutes = 90;
    
        /* On a une variable minutes qui vaut 90.
        Après appel de la fonction, je veux que ma variable
        "heures" vaille 1 et que ma variable "minutes" vaille 30 */
    
        decoupeMinutes(heures, minutes);
    
        printf("%d heures et %d minutes", heures, minutes);
    
        return 0;
    }
    
    void decoupeMinutes(int heures, int minutes)
    {
        heures = minutes / 60;  // 90 / 60 = 1
        minutes = minutes % 60; // 90 % 60 = 30
    }

    -
    Edité par ollorc 22 juin 2020 à 0:27:20

    • Partager sur Facebook
    • Partager sur Twitter
      22 juin 2020 à 0:03:03

      Bonjour,

      Manque de Politesse

      Votre message ne comporte pas ou peu de formules de politesse (« Bonjour », « Merci », « Au revoir », etc.). Les règles du site exigent que chaque nouveau message comporte un minimum de politesse. Après tout, les gens qui répondent le font gratuitement, sur leur temps libre. Ils méritent bien un minimum de considération, n'est-ce pas ?

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        22 juin 2020 à 5:22:16

        Salut,
        Il faudrait peut-être revoir ce chapitre ...
        Un pointeur est une adresse, tu dois donc passer l'adresse de heures et minutes à ta fonction.
        En contre-partie, elle doit retourner des valeurs aux adresses correspondantes.
        En clair, tu dois avoir:
        void decoupeMinutes(int *heures, int *minutes);
        À l'appel:
            decoupeMinutes(&heures, &minutes);
        La fonction:
        void decoupeMinutes(int *heures, int *minutes)
        {
            *heures = *minutes / 60;  // 90 / 60 = 1
            *minutes = *minutes % 60; // 90 % 60 = 30
        }
        Ce n'est pas l'exemple idéal. En général, on passe l'adresse de structures ou autres informations plus complexes.
        Quand la fonction est plus compliquée, on utilise des variables locales.
        Tu pourrais essayer ceci:
        int n = 42;
        int *p;
        p = &n:
        printf("valeurs de n: %d %d\n", n, *p);
        printf("adresses de n: %p %p\n", p, &n);
        printf("adresse de p: %p\n", &p); 
        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          22 juin 2020 à 18:25:24

          La portée des variables.
          Les variables heures et minutes de ton main et celles de ta fonction ne sont pas les mêmes variables.

          Si tu veux modifier la valeur d'une variable d'une fonction depuis une autre fonction, tu n'y parviendra qu'à laide des pointeurs.
          Comme l'a dit PierrotLeFou tu devrais revoir ce chapitre

          • Partager sur Facebook
          • Partager sur Twitter
            25 juin 2020 à 13:34:59

            /* Je mets le prototype en haut. Comme c'est un tout
            petit programme je ne le mets pas dans un .h, mais
            en temps normal (dans un vrai programme), j'aurais placé
            le prototype dans un fichier .h bien entendu */

            C'est pas comme ça que ça marche. On ne découpe pas "parce qu'il faut faire comme ça dans un vrai programme". On découpe quand il y a besoin de découper, avec des morceaux récupérables dans d'autres programmes.

            L'exemple est mal choisi (et le cours est mal foutu).

            D'abord, quand on veut écrire une fonction qui réalise un calcul, il faut avoir une spécification de ce qu'on veut qu'elle fasse.

            Ici, on croit comprendre qu'il s'agit, partant d'un nombre de minutes, de voir combien ça fait d'heures et de minutes.  Par exemple, 95 minutes, ça doit donner 1h et 35 minutes.

            Une solution propre, ça serait de dire que la fonction prend des minutes en paramètres, et retourne des heures et minutes. De là à dire que ça les retourne dans une structure, il n'y a qu'un pas

            struct Duree {
              int heures;
              int minutes;
            };
            
            /**
             * Retourne le découpage d'un temps.
             *
             * \param   minutes    durée en minutes
             * \return             structure contenant les heures et minutes
             */
            int main() {
              struct Duree d = decoupage(95);
              printf("%d h et %d m\n", d.heures, d.minutes);
            }
            
            


            Ah mais zut, ça ne nous fait pas le passage d'adresse :-)

            Donc autre idée : une fonction à qui on donne un temps en minutes, et qui REMPLIT une structure avec le temps découpé etc. Pas de passage par référence en C, on contourne donc en passant une adresse

            Ca s'utilisera comme ça

            int main() {
              struct Duree d;
            
              decouper(95, &d);
              printf("%d h et %d m\n", d.heures, d.minutes);
            }

            et donc

            void decouper(int minutes, struct Duree *r)
            {
               r->heures = minutes / 60,
               r->minutes = minutes % 60
            }

            -
            Edité par michelbillaud 25 juin 2020 à 14:18:44

            • Partager sur Facebook
            • Partager sur Twitter

            À 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