[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. 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
    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. 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. Ok merci beaucoup Chuka, je regarde sa tout de suite

          Merci =)
          0
          1. 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. 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
            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. 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
            4. Ah Ok, merci Fiddy =)

              @+
              0