[C] Problèmes Fonctions & Structures

Résolu
Utilisateur anonyme -  
 Utilisateur anonyme -
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. elayyy
     
    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
  2. chuka Messages postés 980 Statut Membre 379
     
    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
  3. Utilisateur anonyme
     
    Salut,

    #include "main.h" 


    C'est pour ajouter à mon projet le fichier Header qui contient le prototype de ma fontion et ma structure.
    0
  4. Utilisateur anonyme
     
    Ok merci beaucoup Chuka, je regarde sa tout de suite

    Merci =)
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    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
  7. rida_inf Messages postés 86 Statut Membre 1
     
    pourquoi t'utilise le type eucl pas struct ?
    0
    1. Utilisateur anonyme
       
      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
  8. Utilisateur anonyme
     
    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. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
  9. Utilisateur anonyme
     
    Ok merci =)

    Je vais poser une question idiote, mais pourquoi je doit mettre "%f" ? Et pas "%lf" ?
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      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
  10. Utilisateur anonyme
     
    Ah Ok, merci Fiddy =)

    @+
    0