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

  1. #21
    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
    d'acord merci beaucoup.
    J'ai un dernier probleme pour assigné des valeurs dans la fonctions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void Calcul(s_equap)
    {
      ...
       s_equap->a[0]=x; /*erreur: left of '->a' must point to struct/union */
    }
    puis apres j'ai mis pour specifier le a[0] de ce que pointe s_equap
    mais meme erreur.

  2. #22
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut
    C'est le même problème, passe un pointeur comme argument...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void Calcul(s_equap* pEquap)
    {
      ...
       pEquap->a[0]=x; /*erreur: left of '->a' must point to struct/union */
    }

  3. #23
    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
    oui c'sest bien un pointeur;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /*var.h*/
    typedef struct {
    			   float a[N];
    			   float b[N];
    }parameters;
    extern parameters s_equa1;
    extern parameters * s_equap;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* func.h*/
    extern void Calcul(parameters * s_equap);
    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
     
    /*main*/
    #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"
    {
      s_equa1.a[0]=0;
      s_equa1.b[0]=0;	
      s_equap=&s_equa1;						
      Calcul(s_equap);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /*func.c*/
    void CalculCoeffs(s_equap)
    {
      ...
      s_equap->a[0]=x;
    }

  4. #24
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut
    Dans ce cas faudrait peut être donner un type à ta variable passée en paramètre...
    Autre chose, ne donne pas de nom de variables globales aux variables locales.
    s_equap est une variable globale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void CalculCoeffs(parametres* pDest)
    {
      ...
      pDest->a[0]=x;
    }

  5. #25
    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
    Ca a marché mais cela m'a perdu.
    Ma structure est "parameters" donc j'ai une structure de type parameters

    Je créé une structure "s_equap" donc:
    nom -> "s_equa"
    type -> "parameters"

    Je créé un pointeur vers structure (peut on dire vers "parameters"?)
    nom -> "s_equap"
    type -> "pointeur vers 'parameters' "

    dans une fonction sans struct:
    void calcul(float * p)

    ici
    void calcul(parameters * s_equap)

    donc en fait il manquait de spécifié le type est ce bon?

    ce que je comprend mal c'est en suivant la hierarchie:

    structure->parameters->equa
    " * -> equap

    equa est quoi, une structure de type parametre un parametre de type strucure?

  6. #26
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut
    C'est en fait que tout est mélangé dans ton programme. Quand je parle de paramètres, c'est de paramètres de fonctions C (ou procédures, mais c'est un autre débat).
    tu as créé un type parameters
    tu as créé une variable de type parameters (s_equa)
    tu as créé un pointeur vers un parameters (s_equap)

    Ton GROS problème est que tu passes une variable globale (en l'occurrence s_equap) en paramètre local d'une fonction.

  7. #27
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut
    Citation Envoyé par sone47
    void calcul(parameters * s_equap)

    donc en fait il manquait de spécifié le type est ce bon?
    Oui mais cela ne suffit pas, il faut déclarer ta fonction calcul avec un autre nom de variable en paramètre

    par exemple

    void calcul(parameters * s_equap_local)

  8. #28
    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
    Oui je viens de remarquer.
    Merci beaucoup, c'est du au fait que je declare mes variables dans un autre fichier je n'avais pas fait attention qu'elles étaient en global du coup cela fonctionnait quand meme dans la fonction.
    Desormais j'ai changé le nom du parametre de la fonction et dedans je travaille avec cette variable locale.
    En tout cas merci elles m'auront bien destructurées le cerveau ces structures!!

  9. #29
    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
    Mais n'y a t il pas une methode pour alleger visuellement le programme car le mien avec les structures est assez lourd alors qu'il n'y en a qu'une, tout ces "s_equap_loc->..." je me demande si en faisant voir mon prog a quelqu'un il va s'y retrouver. Faut il juste prendre l'habitude?
    Dans la pratique on utilise des structures jusqu'a un certain nombre de para ou c'est selon le besoin?

  10. #30
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    En général c'est selon le besoin, mais par contre si il y a beaucoup de paramètres, c'est que la conception n'est peut-être pas forcément bien terminée.

    Il peut y avoir des structures englobant d'autres structures, afin de mieux cerner les paramètres.

    Pour reprendre un exemple courant ici :

    Pour un annuaire, on peut définir une structure abonné, avec nom, adresse, numéro, et une structure ville contenant par exemple une carte, et une liste de structures abonnés.

  11. #31
    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
    Oui et je pense qu'avec l'habitude on doit plus facilement se repérer.
    En tout cas merci de toute l'aide apportée vraiment.

  12. #32
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Par défaut
    C'est comme partout, c'est selon le besoin. Quant à utiliser des s_equap-> partout, ça ne pose aucun problème de lecture. Ca devient pénible quand tu as des pointeurs vers des structures imbriquées. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct{
      float diametre;
      float largueur;
    }tRoue;
     
    typedef struct{
      tRoue* roueAvant;
      tRoue* roueArrière;
      tCadre* cadre;
    }tVelo;
    dans ce cas, si tu as une variable monVelo et pMonVelo un pointeur vers monVelo, pour accéder au diamètre de la roue avant, ca donne
    pMonVelo->roueAvant->diametre
    Suivant ta structure de données, ca peut donner des trucs longs. Ils peuvent cependant être raccourcis avec un petit #define
    Là par exemple, si on fait
    #define maRoueAvant pMonVelo->roueAvant
    tu accèdes à son diamètre en faisant
    maRoueAvant->diametre
    En fait tu as tout un panel de choix, sans forcément passer par des pointeurs, pour structurer ton code. La première partie du codage (qui est la dernière partie de la conception) consiste justement en le choix de ta structure de donnée.

  13. #33
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    c'est du au fait que je declare mes variables dans un autre fichier je n'avais pas fait attention qu'elles étaient en global du coup cela fonctionnait quand meme dans la fonction.
    Supprime les variables globales! Ce sont des pestes vicieuses qui semble au début simplifier l'écriture d'un programme mais qui te font payer le prix fort à la fin.

  14. #34
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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

  15. #35
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    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;

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, 09h29
  2. tableau de structure en parametre fonction
    Par Dark_Alex69 dans le forum Débuter
    Réponses: 3
    Dernier message: 12/11/2007, 19h38
  3. Réponses: 7
    Dernier message: 08/04/2006, 13h18
  4. Tableau de structures en parametre d'une fonction
    Par -No Comment- dans le forum C
    Réponses: 19
    Dernier message: 29/03/2006, 16h00
  5. Réponses: 12
    Dernier message: 25/01/2006, 08h29

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