Partage
  • Partager sur Facebook
  • Partager sur Twitter

Warning lors de la compilation

    5 mars 2022 à 16:54:35

    Bonjour 

    je fait un programme qui divise 2 paramètres est stock le résultat dans un int ainsi que le reste de la division dans un second int

    mon programme compile et s'éxécute mais j'ai des warning 

    ft_div_mod.c:45:20: warning: incompatible pointer types passing 'int **' to parameter of type 'int *'; remove & [-Wincompatible-pointer-types]
        ft_div_mod(a,b,&div,&mod);
                       ^~~~
    ft_div_mod.c:27:39: note: passing argument to parameter 'div' here
    void    ft_div_mod(int a, int b, int *div, int *mod)
                                          ^
    ft_div_mod.c:45:25: warning: incompatible pointer types passing 'int **' to parameter of type 'int *'; remove & [-Wincompatible-pointer-types]
        ft_div_mod(a,b,&div,&mod);
                            ^~~~
    ft_div_mod.c:27:49: note: passing argument to parameter 'mod' here
    void    ft_div_mod(int a, int b, int *div, int *mod)
                                                    ^
    2 warnings generated.

    J'essaye de les comprendre mais la j'ai du mal, si quelqu'un veut bien m'expliquer pour que je puisse les prévoir a l'avenir 

    merci !

    Voici mon code 

    #include <unistd.h>
    
    void ft_putchar(char c)
    {
        write(1, &c, 1);
    }
    
    void    ft_putnbr(int nb)
    {
       if (nb < 0)
       {
           ft_putchar('-');
           nb = -nb;
       }
       if (nb >= 0 && nb <= 9)
       {
        ft_putchar(nb + '0');
       }
        if (nb >= 10)
        {
            ft_putnbr(nb / 10);
            ft_putnbr(nb % 10);
        }
       
    }
    
    void    ft_div_mod(int a, int b, int *div, int *mod)
    {
        *div = a / b;
        *mod = a % b;
        ft_putnbr(*div);
        ft_putchar(',');
        ft_putnbr(*mod);
    }
    
    int main()
    {
        int a;
        int b;
        int *div;
        int *mod;
    
        a = 789;
        b = 32;
        ft_div_mod(a,b,&div,&mod);
    }

    Edit : c'est bon en faite j'ai trouvé dans mon main je re demander a pointer sur div et mod alors que c'est préciser dans mes paramètres 

    -
    Edité par leprincefou 5 mars 2022 à 17:12:17

    • Partager sur Facebook
    • Partager sur Twitter
    Notre mesure du possible rend possible l'impossible  
      5 mars 2022 à 17:41:01

      Le prototype de ft_div_mod attend en 3 et 4 ème argument l'adresse d'un entier et toi tu envois l'adresse d'un pointeur !
      • Partager sur Facebook
      • Partager sur Twitter
      ...
        7 mars 2022 à 17:32:54

        Le message du warning était suffisamment clair il me semble :-° il indiquait clairement de supprimer le & dans l'appel de la fonction pour mod et  pour div
        • Partager sur Facebook
        • Partager sur Twitter
          7 mars 2022 à 17:37:13

          umfred a écrit:

          Le message du warning était suffisamment clair il me semble :-° il indiquait clairement de supprimer le & dans l'appel de la fonction pour mod et  pour div

          Pas très judicieux !

          Je supprimerais plutôt l'étoile de la déclaration de div et mod !

          • Partager sur Facebook
          • Partager sur Twitter
          ...
            7 mars 2022 à 18:09:18

            A quoi ça sert de passer div et mod en paramètres vu que

            int main()
            {
                int a;
                int b;
                int *div;
                int *mod;
             
                a = 789;
                b = 32;
                ft_div_mod(a,b,&div,&mod);
            }

            1. ils ne sont pas initialisés au moment de l'appel

            2. on ne fait rien de leur valeur ensuite.



            • Partager sur Facebook
            • Partager sur Twitter
              7 mars 2022 à 18:32:02

              Comme la fonction est mal engagé on pourrait se le demander.

              Il faudrait plutôt qu'elle n'affiche rien et quel ce servent des pointeurs pour retourner les deux valeurs (le résultat de la division et le modulo).

              Tout dépend du pourquoi le PO fait ça ? Moi, je le vois comme des exercices, ce n'est donc pas vraiment fait pour servir à quelque chose. Tout dépend du point de vue qu'on a sur la chose ! 

              • Partager sur Facebook
              • Partager sur Twitter
              ...
                7 mars 2022 à 18:41:27

                Merci rouloude c'est ce que j'avais fait 

                Umfred il l'était pas assez pour moi faut croire, deuxièmement en t'écoutant je fait carrément crash le programme, si je les enlève dans l'appel comment ma fonction main fait le liens avec les valeur de ma fonction Div ? 

                Michel c'est l'exo c'est comme ça pour l'instant je pisse du code tout en essayant de comprendre. (dans le sens contraire ca marche pas)

                Ensuite si une âme charitable peut m'expliquer (Tranquillement) lors de mon appel ainsi tout fonctionne 

                j'appel ma fonctions ensuite je print heure est minute mais avant j'avais déclarer grace au & que j'allais justement chercher leur adresse, la fonctions fait sa fonction ensuite j'affiche avec les modification, faite par l'appel de la fonction dans le main, juste avant ok.

                #include <stdio.h>
                #include <stdlib.h>
                 
                
                int decoupeMinutes(int *heures, int *minutes)
                {
                    *heures  = *minutes / 60;  // 90 / 60 = 1
                    *minutes = *minutes % 60; // 90 % 60 = 30
                    return 0;
                }
                
                int main(int argc, char *argv[])
                {
                    int heures = 0, minutes = 525600;
                
                    decoupeMinutes(&heures, &minutes);
                    printf("%d heure %d minute \n", heures, minutes);
                
                    return 0;
                }

                Maintenant j'essaye de l'appeler autrement c'est a dire directement dans le printf du style 

                printf("%d heure %d minute \n", decoupeMinutes(&heures, &minutes));
                
                

                et la sa m'affiche "more '%' conversions than data arguments" qui me dit que j'ai plus de % que d'argument pourtant j'ai deux % % pour deux arguments qui sont &heure, &minutes.



                -
                Edité par leprincefou 7 mars 2022 à 18:51:58

                • Partager sur Facebook
                • Partager sur Twitter
                Notre mesure du possible rend possible l'impossible  
                  7 mars 2022 à 19:45:41

                  Hello,

                  Il va falloir que tu révises le cours sur les fonctions !

                  Ta fonction renvoie un int (qui vaut zéro) (elle ne pourrait d'ailleurs pas renvoyer plus d'une valeur). heures et minutes ne sont que des arguments. D'accord, ta fonction les modifie, donc se sont eux qu'il faut afficher.

                  -
                  Edité par edgarjacobs 7 mars 2022 à 19:53:45

                  • 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

                    7 mars 2022 à 20:01:45

                    rouloude a écrit:


                    Tout dépend du pourquoi le PO fait ça ? Moi, je le vois comme des exercices, ce n'est donc pas vraiment fait pour servir à quelque chose. Tout dépend du point de vue qu'on a sur la chose ! 


                    Et bien normalement, les exercices ne consistent pas à écrire du code au pif, et ils ont

                    • un objectif
                    • une logique
                    Là, visiblement, on devine que l'objectif, c'est de faire utiliser les pointeurs comme moyen de simuler un passage de paramètre "en sortie". Et pour ça on force en demandant d'écrire une fonction qui a deux paramètres de sortie. Comme ça le débutant ne peut pas utiliser le mécanisme normal de retour de la fonction.
                    En fait si, il pourrait parfaitement, en utilisant une structure pour retourner les résultats
                    struct resultat {
                       int quotient;
                       int reste;
                    };
                    
                    struct resultat  resultat_division(int a, int b)
                    {
                       struct resultat r = {
                          .quotient = a / b,
                          .reste    = a % b
                       };
                       return r;
                    }
                    
                    
                    mais bon niveau idées sur la programmation, les cours de C en sont restés au style "C préhistorique" (B) des années 70 où les gens n'avaient pas l'habitude d'employer des structures.
                    ---
                    Partant de là, l'exercice heures minutes est mal posé. Pourquoi tient-on compte des minutes en entrée, mais pas des heures ? C'est absurde.
                    Il s'agit de décomposer un temps donné en nombre de minutes en heures et minutes, et c'est juste :
                    int temps_en_minutes = ....;
                    
                    struct resultat r = resultat_division(temps_en_minutes, 60);
                    
                    printf("%d minutes, ça fait %d heures et %d minutes\n",
                           r.quotient,
                           r.reste);
                    
                    ---
                    pour le code de l'OP, question de logique du découpage en fonctions
                    void    ft_div_mod(int a, int b, int *div, int *mod)
                    {
                        *div = a / b;
                        *mod = a % b;
                        ft_putnbr(*div);
                        ft_putchar(',');
                        ft_putnbr(*mod);
                    }
                    qu'est-ce que le putchar vient faire là dedans ?   Un bon principe de programmation c'est le "separation of concern". La fonction est chargée de faire des divisions entières - et c'est ce que dit son nom - et dans ce cas son job, c'est pas d'afficher.  C'est au main de le faire
                    int main() 
                    {  
                       int a = 789, b = 32;
                       int quotient, reste;
                    
                       ft_div_mod(a, b, &quotient, &reste);
                    
                       // affichages de quotient et reste ici.
                       // ...
                    
                       return 0;
                    }
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 mars 2022 à 20:25:23

                      leprincefou a écrit:

                      Maintenant j'essaye de l'appeler autrement c'est a dire directement dans le printf du style 

                      printf("%d heure %d minute \n", decoupeMinutes(&heures, &minutes));
                      
                      

                      et la sa m'affiche "more '%' conversions than data arguments" qui me dit que j'ai plus de % que d'argument pourtant j'ai deux % % pour deux arguments qui sont &heure, &minutes.

                      Non, il y a un seul argument dans le 'printf' : 

                      decoupeMinutes(&heures, &minutes)   // 1 argument : le retour de l'appel à 'decopeMinutes'
                      

                      &heures et &minutes ne sont pas les arguments de 'printf', ce sont les arguments de 'decoupeMinutes' (et je suis sûr que tu le sais ! :) )


                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 mars 2022 à 0:04:58

                        Un grand merci pour toutes vos précisions
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Notre mesure du possible rend possible l'impossible  

                        Warning lors de la compilation

                        × 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