IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

structure en parametre de fonction


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut structure en parametre de fonction
    Bonjour je pense avoir quelques problemes avec les structures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    typedef struct {
    	   float a;
    	   float b;
    	   float x;
    	   float y;
    } s_parameters;
    int main ()
    {
      s_parameters equa1;
      equa1.a=8;
      equa1.b=7;
      equa1.x=4;
      calcul(equa1);
      return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    s_parameters calcul(s_parameters equa)
    {
      equa.y=equa.x+equa.b;
      return equa;
    }
    en fait je me perd dans le nom de ma structure si j'utilise typedef, que dois je passer en parametre que dois retourner ma fonction comment dois je affecter les valeurs dans ma fonction?
    Est t il mieux de passer une structure ou un pointeur de structure ?
    Merci davance

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 349
    Par défaut
    Pour répondre à une de tes questions, il vaut mieux passer l'adresse de ta structure en paramètres que la structure elle-même.

    Pour deux raisons:
    - même si ce n'est plus trop un problème sur la plupart des systèmes, le passage de la structure en tant que paramètre consomme de la pile. C'est donc plus gourmand en mémoire et moins rapide à l'exécution.
    - passer l'adresse de ta structure te permet de modifier la structure d'origine (et non une copie de celle-ci)

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    ok merci donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    typedef struct {
    	   float a;
    	   float b;
    	   float x;
    	   float y;
    } s_parameters;
    int main ()
    {
      s_parameters equa1;
      equa1.a=8;
      equa1.b=7;
      equa1.x=4;
      s_parameters *p_equa;
      p_equa = &equa1;
      calcul(p_equa);
      return 0;
    }Code :
     
    s_parameters *  calcul(s_parameters * equa)
    {
      equa->y=equa->x+equa->b;
      return equa;
    }
    comme ceci?
    ps: je ne conmprend les erreurs de nom de parametre du premier prog si quelqu'un peut m'aider
    merci

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    ok pas besoin de retourner equa.
    merci
    par contre comment dois je nommer les variables que je modifie dans ma fonction si a et b sont tableaux?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void calcul(s_parameters * p)
    {
      for(i=0;i<MAX;i++)
      {
        p->a[i]=0;
      }
    }

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    typedef struct s_parameters{
    			 float a[N];
    			 float b[N];
    			 } ;
     
    void main(int argc, char* argv[])
    {
      struct s_parameters equa1;
      equa1.a[0]=0;
      equa1.a[1]=0;
      s_parameters * p_equa=malloc(sizeof(*equa1));
      if(p_equa==NULL)
      {
       fprintf(stderr,"Erreur\n");
       exit(EXIT_FAILURE);
      }
    }
    me donne une erreur sur mon pointeur "undeclared identifier"

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Je n'arrive pas a saisir la difference de mettre le typedef
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    void calcul(s_parameters_equa);
    typedef struct {
    			   float a[N];
    			   float b[N];
    } s_parameters;
    void main(int argc, char* argv[])
    {
      s_parameters equa1;
      equa1.a[0]=0;
      equa1.b[0]=0;
      s_parameters * p_equa=malloc(sizeof(equa1));
      if(equa1==NULL)
      {
       fprintf(stderr,"Erreur\n");
       exit(EXIT_FAILURE);
       calcul(p_equa);
    }
    et sans le typedef

    Ceci me genere des erreurs a l'allocation memoire et les types de ma fonction calcul ne sont pas reconnu je ne comprend pas comment definir en parametre.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sone47
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct s_parameters{
    			 float a[N];
    			 float b[N];
    			 } ;
    me donne une erreur sur mon pointeur "undeclared identifier"
    Il faut réouvrir ton livre de C de temps en temps.

    Une structure se définit avec le mot clé struct et un tag :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct parameters
    {
       float a[N];
       float b[N];
    };
    On peut aussi créer un alias séparé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef struct parameters parameters_s;
    Enfin, on peut combiner la création de l'alias avec la définition de la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct parameters
    {
       float a[N];
       float b[N];
    }
    parameters_s;
    Dans ce cas, on peut ommettre le tag qui, ici, n'est pas utile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct
    {
       float a[N];
       float b[N];
    }
    parameters_s;

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Le plus efficace est de passer un pointeur sur ta structure à ta fonction. Ainsi, il vient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    typedef struct {
    	   float a;
    	   float b;
    	   float x;
    	   float y;
    } s_parameters;
     
    int calcul(s_parameters *p_equa)
    {
      int err = 0;
      if (p_equa != NULL)
      {
        p_equa->y=p_equa->x + p_equa->b;
      }
      else
      {
        err = -1;
      }
      return err;
    }
     
    int main (void)
    {
      s_parameters equa1 = {8, 7, 4};
     
      calcul(&equa1);
      return 0;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  9. #9
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par sone47
    en fait je me perd dans le nom de ma structure si j'utilise typedef, que dois je passer en parametre que dois retourner ma fonction comment dois je affecter les valeurs dans ma fonction?
    Lorsque tu utilises un typedef comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct {
    	   float a;
    	   float b;
    	   float x;
    	   float y;
    } s_parameters;
    Tu peux déclarer une variable comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    s_parameters blabla; /* Une variable de type s_parameters */
    s_parameters *p_blabla; /* Un pointeur vers une structure s_parameters */
    Ensuite l'accés aux éléments dépend si c'est un pointeur ou non...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    blabla.x = 5; /* On utilise le . */
    p_blabla = &blabla; /* p_blabla pointe sur blabla maintenant */
    p_blabla->y = 4; /* On utilise la -> parce que c'est un pointeur */
    Pour une fonction, il vaut mieux passer par pointeur, car passer la structure résulte en une recopie inutile. L'utilisation du mot clé const peut permettre d'assurer que la fonction ne modifiera pas la structure si cela est nécessaire ou simplement voulu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    int main ()
    {
      s_parameters equa1;
      equa1.a=8;
      equa1.b=7;
      equa1.x=4;
      calcul(&equa1);
      return 0;
    }
     
    void calcul(s_parameters *equa)
    {
      if(equa != NULL) {
        equa->y=equa->x+equa->b;
      }
    }
    Remarque que dans ton code, tu devais récupérer le retour de la fonction calcul pour pouvoir avoir le résultat du calcul... Le fait de passer la structure sans passé par un pointeur provoque une copie superficielle de la structure.

    Donc au retour de la fonction, ta structure de départ n'est pas modifié.

    Jc

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par sone47
    Bonjour je pense avoir quelques problemes avec les structures

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    typedef struct {
    	   float a;
    	   float b;
    	   float x;
    	   float y;
    } s_parameters;
    int main ()
    {
      s_parameters equa1;
      equa1.a=8;
      equa1.b=7;
      equa1.x=4;
      calcul(equa1);
      return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    s_parameters calcul(s_parameters equa)
    {
      equa.y=equa.x+equa.b;
      return equa;
    }
    en fait je me perd dans le nom de ma structure si j'utilise typedef, que dois je passer en parametre que dois retourner ma fonction comment dois je affecter les valeurs dans ma fonction?
    Est t il mieux de passer une structure ou un pointeur de structure ?
    Merci davance

    oui, il faut toujours passer en argument non pas une structure mais un pointeur vers cette structure. Si tu passes une structure, tu la recopies et c'est long. Si tu passes un pointeur, tu ne recopies qu'un pointeur

    Ton code deviendrait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    typedef struct {
    	   float a;
    	   float b;
    	   float x;
    	   float y;
    } s_parameters;
    int main (void)
    {
      s_parameters * equa1=malloc(sizeof(*equa1));
      if(equa1==NULL)
      {
       fprintf(stderr,"Erreur\n");
       exit(EXIT_FAILURE);
      }
      equa1->a=8;
      equa1->b=7;
      equa1->x=4;
      calcul(equa1);
      free(equa1); equa1=NULL;
      return 0;
    }
     
    void calcul(s_parameters * equa)
    {
      equa->y=equa->x+equa->b;
    }

  11. #11
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par salseropom
    oui, il faut toujours passer en argument non pas une structure mais un pointeur vers cette structure. Si tu passes une structure, tu la recopies et c'est long. Si tu passes un pointeur, tu ne recopies qu'un pointeur

    Ton code deviendrait :
    Wow, un malloc pour un exemple aussi simple

    Tu pouvais juste passer le pointeur vers une structure statique non ?

    Jc

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par fearyourself
    Wow, un malloc pour un exemple aussi simple

    Tu pouvais juste passer le pointeur vers une structure statique non ?

    Jc
    oui...

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    merci.
    Malgré cette notation le compilateur me fait remarquer des erreurs.
    Mon programme se decompose de 5 fichiers.
    un main.c un func.c ou je defini la fonction et un var.c ou je defini les variables.
    De plus j'ai un var.h et un func.h ou je definie le prototype de la fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* func.h */
    extern void Calcul(parameters * equap);
    et j'ai des erreurs de syntaxes que je ne trouve pas sur cette ligne

    Dans mon main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    #ifdef __cplusplus
    #error This source file is not C++ but rather C. Please use a C-compiler
    #endif
     
    #include<stdlib.h>
    #include<math.h>      																													
    #include "var.h"
    #include "func.h"
     
    typedef struct {
    			   float a[N];
    			   float b[N];
    }parameters;
     
     
    void main(int argc, char* argv[])
    {
      parameters equa1;
      equa1.a[0]=0;
      equa1b[0]=0;
      parameters * equap=malloc(sizeof(equa1)); /* ici erreur:'parameters' : illegal use of this type as an expression */
      if(equap==NULL)
      {
       fprintf(stderr,"Erreur\n");
       exit(EXIT_FAILURE);
      }

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Le typedef de structure devrait être dans func.h...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre émérite Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Par défaut
    Dans ton cas, pour décider si on doit utiliser des structures ou
    pointeurs de structures, il faut se poser la question de savoir si
    ta fonction modifie la variable equa passée en argument.
    C'est à dire, est-ce que equa est une variable en entrée/sortie
    de ta fonction, ou en entrée seule.

    Par exemple si tu utilise les structures (variable en entrée seule) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main () {
      s_parameters equa1, equa2;
     
      equa1.y=0;
     
      equa1.b=7;
      equa1.x=4;
      equa2 = calcul(equa1);
      printf("equa1.y = %d\n", equa1.y);
      printf("equa2.y = %d\n", equa2.y);
      return 0;
    }
    affichera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    equa1.y = 0
    equa2.y = 11
    Si tu utilise des pointeurs (variable en entrée sortie), alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    s_parameters* calcul(s_parameters *equa) {
      equa->y=equa->x+equa->b;
      return equa;
    }
     
    int main () {
      s_parameters equa1, *equa2;
     
      equa1.y=0;
     
      equa1.b=7;
      equa1.x=4;
      equa2 = calcul(&equa1);
      printf("equa1.y = %d\n", equa1.y);
      printf("equa2->y = %d\n", equa2->y);
      return 0;
    }
    affichera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    equa1.y = 11
    equa2->y = 11
    Ce qui surement plus ce que tu recherches.

  16. #16
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sone47
    en fait je me perd dans le nom de ma structure si j'utilise typedef, que dois je passer en parametre que dois retourner ma fonction comment dois je affecter les valeurs dans ma fonction?
    Est t il mieux de passer une structure ou un pointeur de structure ?
    http://emmanuel-delahaye.developpez....difie_variable

Discussions similaires

  1. Passage de structure en parametre fonction : Pointeur
    Par apicard3 dans le forum Débuter
    Réponses: 5
    Dernier message: 30/10/2013, 08h29
  2. tableau de structure en parametre fonction
    Par Dark_Alex69 dans le forum Débuter
    Réponses: 3
    Dernier message: 12/11/2007, 18h38
  3. Réponses: 7
    Dernier message: 08/04/2006, 12h18
  4. Tableau de structures en parametre d'une fonction
    Par -No Comment- dans le forum C
    Réponses: 19
    Dernier message: 29/03/2006, 15h00
  5. Réponses: 12
    Dernier message: 25/01/2006, 07h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo