[C] Problèmes Fonctions & Structures

Résolu/Fermé
Utilisateur anonyme - 27 juin 2009 à 10:29
 Utilisateur anonyme - 27 juin 2009 à 15:33
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

9 réponses

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
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
27 juin 2009 à 11:10
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
Utilisateur anonyme
27 juin 2009 à 11:11
Salut,

#include "main.h" 


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

Merci =)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
27 juin 2009 à 11:21
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
rida_inf Messages postés 71 Date d'inscription mercredi 21 mai 2008 Statut Membre Dernière intervention 29 septembre 2016 1
27 juin 2009 à 11:23
pourquoi t'utilise le type eucl pas struct ?
0
Utilisateur anonyme
27 juin 2009 à 11:28
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
Utilisateur anonyme
27 juin 2009 à 11:25
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
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
27 juin 2009 à 12:19
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
Utilisateur anonyme
27 juin 2009 à 12:24
Ok merci =)

Je vais poser une question idiote, mais pourquoi je doit mettre "%f" ? Et pas "%lf" ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
27 juin 2009 à 13:35
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
Utilisateur anonyme
27 juin 2009 à 15:33
Ah Ok, merci Fiddy =)

@+
0