[C] Problèmes Fonctions & Structures

Résolu
Bonjour a tous

Je débute en programmation et je m'interesse au langage C.
J'ai "programmé" un petit programme qui fait des divisions euclidiennes.

J'ai réussi à le faire sans fonctions, mais je voudrais le faire avec une fonction.

Résumé du programme :
- Initialisation de "x", "y", et la structure "calcul" de type "EUCL"
- La structure "EUCL" a 2 composantes : "result" et "reste"
- L'utilisateur entre les 2 nombres de départ (x et y)
- "x", "y" et "calcul" sont envoyés à la fonction "division_eucl".
- La fonction "division_eucl" fait les calculs, puis renvoie la structure (qui contient "result" et "reste").
- On affiche les resultats

Mais j'ai quelques erreurs quand je debug :
main.h|11|warning: parameter names (without types) in function declaration|
main.c||In function `division_eucl':|
main.c|24|error: request for member `result' in something not a structure or union|
main.c|25|error: request for member `reste' in something not a structure or union|
||=== Build finished: 2 errors, 1 warnings ===|


Voici mon code :

main.c
#include <stdio.h>
#include <stdlib.h>

#include "main.h"

int main()
{
    double x=0, y=0;
    EUCL calcul = {0};

    system ("cls");
    printf ("\nPremier nombre : ");
    scanf ("%lf", &x);
    printf ("\nDeuxieme nombre : ");
    scanf ("%lf", &y);
    division_eucl(x,y,calcul);
    printf ("\n%lf / %lf = %lf\nReste : %ld\n\n\n", x, y, calcul.result, calcul.reste);
    system ("pause");
    return 0;
}

double division_eucl(x,y,calcul)
{
    calcul.result = x / y;
    calcul.reste = x % y;
    return (calcul);
}


main.h
typedef struct EUCL EUCL;
struct EUCL
{
    double result;
    long reste;
};

double division_eucl(x,y,calcul);


Auriez-vous une idée pour résoudre ce problème ?

Je code sous Code::Blocks

Merci d'avance

Bye

--
A PC is like a plane, when you open Windows, it's the crash !!!

1/= |_| [4/V |^34[) 7#15, |_|'|^3 4/V 3><7|^3(v)3 633|< !!!

9 réponses

  1. Ah Ok, merci Fiddy =)

    @+
    0
    1. Ok merci =)

      Je vais poser une question idiote, mais pourquoi je doit mettre "%f" ? Et pas "%lf" ?
      0
      1. Contributeur
        pourquoi je doit mettre "%f" ? Et pas "%lf" ?
        Car en C, les float sont promus en double pour les fonctions à arguments variables (cas de printf).

        A noter que pour scanf c'est différent, il faut bel et bien utiliser %lf pour un double.
        0
    2. En fait, j'ai réussi a contourné le problème grâce à la fonction "fmod" de <math.h>.

      Pour ceux qui sont interessés, voici le code final :

      main.c
      #include <stdio.h>
      #include <stdlib.h>
      #include <math.h>
      
      #include "main.h"
      
      int main()
      {
          double x=0, y=0;
          EUCL calcul = {0};
      
          system ("cls");
          printf ("\nPremier nombre : ");
          scanf ("%lf", &x);
          printf ("\nDeuxieme nombre : ");
          scanf ("%lf", &y);
          division_eucl(x,y,&calcul); // Passage par reference de la structure
          printf ("\n%lf / %lf = %ld\nReste : %ld\n\n\n", x, y, calcul.result, calcul.reste);
          system ("pause");
          return 0;
      }
      
      void division_eucl(double x,double y,EUCL*calcul) //Pas besoin de retour car la structure est en argument.
      {
          calcul->result = x / y;
          calcul->reste = fmod(x,y);
      }
      


      main.h
      typedef struct EUCL EUCL;
      struct EUCL
      {
          long result;
          long reste;
      };
      
      void division_eucl(double x,double y,EUCL*calcul);
      
      double fmod(double,double);
      


      Merci encore Chuka pour ton aide =)

      Bye
      0
      1. Contributeur
        Salut,

        J'arrive un peu tard.
        Effectivement tu devais utiliser fmod puisque x et y ne sont pas des entiers.

        Sinon juste une petite correction :
        printf ("\n%lf / %lf = %ld\nReste : %ld\n\n\n", x, y, calcul.result,
        Il faut mettre %f dans printf et non %lf.

        // Passage par reference de la structure
        N'oublie pas qu'en C il n'y a pas de passage par référence. Ici tu as fait un passage par adresse.

        Cdlt
        0
    3. pourquoi t'utilise le type eucl pas struct ?
      0
      1. Salut, j'ai pas besoin de mettre :

        struct EUCL


        Je peux juste mettre :

        EUCL


        Car j'ai utilisé "typedef" dans mon fichier header :

        typedef struct EUCL EUCL;


        Grâce a cette ligne, je n'ai plus besoin de mettre "struct" à chaque fois.
        0
    4. J'ai modifié mon code, voila le fichier "main.c" :
      #include <stdio.h>
      #include <stdlib.h>
      
      #include "main.h"
      
      int main()
      {
          double x=0, y=0;
          EUCL calcul = {0};
      
          system ("cls");
          printf ("\nPremier nombre : ");
          scanf ("%lf", &x);
          printf ("\nDeuxieme nombre : ");
          scanf ("%lf", &y);
          division_eucl(x,y,&calcul); // Passage par reference de la structure
          printf ("\n%lf / %lf = %lf\nReste : %ld\n\n\n", x, y, calcul.result, calcul.reste);
          system ("pause");
          return 0;
      }
      
      void division_eucl(double x,double y,EUCL*calcul) //Pas besoin de retour car la structure est en argument.
      {
          calcul->result = x / y;
          calcul->reste = x % y;
      }
      


      J'ai aussi modifié le prototype de ma fonction dans le fichier ".h"

      Mais il y a encore un problème, lorsque je debug mon programme :

      A cette ligne :
      calcul->reste = x % y;


      Code::Blocks m'affiche cette erreur :

      main.c|25|error: invalid operands to binary %|


      Vous avez une idée ?

      Merci d'avance

      Bye
      0
      1. Ok merci beaucoup Chuka, je regarde sa tout de suite

        Merci =)
        0
        1. Salut,

          #include "main.h" 


          C'est pour ajouter à mon projet le fichier Header qui contient le prototype de ma fontion et ma structure.
          0
          1. Salut,
            voici quelques commentaires:
            int main()
            {
                double x=0, y=0;
                EUCL calcul ;
            
                system ("cls");
                printf ("\nPremier nombre : ");
                scanf ("%lf", &x);
                printf ("\nDeuxieme nombre : ");
                scanf ("%lf", &y);
            //passage par reference de ta structure
                division_eucl(x,y,&calcul);
                printf ("\n%lf / %lf = %lf\nReste : %ld\n\n\n", x, y, calcul.result, calcul.reste);
                system ("pause");
                return 0;
            }
            //tu n'a pas besoin de retour car tu passe ta structure en argument
            void division_eucl(double x,double y,EUCL*calcul)
            //double division_eucl(x,y,calcul)
            {
                calcul->result = x / y;
                calcul->reste = x % y;
              //  return (calcul);
            }
            
            Main.h
            typedef struct EUCL EUCL;
            struct EUCL
            {
                double result;
                long reste;
            };
            
            void division_eucl(double,double,EUCL*);
            
            


            J'espere ca pourra t'aider!!
            @+
            0
            1. Je sens que tu débutes comme moi avec le tutoriel sur le Site du Zéro!! N'est-ce pas?

              Bref...je comprend pas pourquoi tu écris ça : #include "main.h"

              pourrais-tu m'expliquer?
              0