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 :

Utilisation pointeurs et structures imbriquées


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 29
    Points : 11
    Points
    11
    Par défaut Utilisation pointeurs et structures imbriquées
    Bonjour,

    J'aimerais passer à une fonction l'adresse d'une structure qui est imbriquée dans une structure.

    Je me suis inspiré d'un exemple d'un autre post :
    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
    29
    30
    typedef struct
    {
      int x;
      int y;
    } Coordonnees;
     
    struct MaStructure
    {
        Coordonnees element;
        int monBooleen;
        char maChaine[10];
    };
     
    int somme(Coordonnees * var)
    {
            return (var->x + var->y);
    }
     
     
    int main (void)
    {
       struct MaStructure test;
     
       test.element.x = 1;
       test.element.y = 2;
       int res = somme(test->element);
       msg(ERROR, 0, "x:%d y:%d somme:%d", test.element.x, test.element.y, res);
     
       return 0;
    }
    comprenez vous l'erreur suivante ? (indiquée au niveau de l'appel à somme())
    error: invalid type argument of '->' (have 'struct MaStructure')

    Salutations,

    Vincent

    EDIT : Merci à foetus et Sve@r pour la solution

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int res = somme(&(test.element));

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par vincenet Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main (void)
    {
       struct MaStructure test;
     
       test.element.x = 1;
       test.element.y = 2;
       int res = somme(test->element);
       msg(ERROR, 0, "x:%d y:%d somme:%d", test.element.x, test.element.y, res);
     
       return 0;
    }

    comprenez vous l'erreur suivante ? (indiquée au niveau de l'appel à somme())
    error: invalid type argument of '->' (have 'struct MaStructure')
    Bonjour

    L'instruction x->y se lit comme le membre "y" de l'élément pointé "x" => autrement dit, x est un pointeur (qui contient une adresse), tu vas récupérer le contenu de cette adresse (une structure) et de cette structure tu récupères l'élément "y". C'est comme si tu écrivais (*x).y mais pour simplifier et éviter des parenthèses, on utilise l'opérateur "flèche".

    Or, "test" n'est pas un pointeur donc pas de flèche.

    Toi tu veux passer (comme tu l'as dit) l'adresse de cet élément. Donc, comme l'a dit foetus, (et la logique associée à ce que tu as dit), il faut bien passer l'adresse de ton truc => &test.element (pas besoin de parenthèses).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Or, "test" n'est pas un pointeur donc pas de flèche.
    Je pense que vincenet doit le savoir puisqu'il accède aux attributs, 1 ligne avant, comme cela test.element.y. Il semble plus chercher comment récupérer l'adresse d'une structure imbriquée

    Citation Envoyé par Sve@r Voir le message
    (pas besoin de parenthèses).
    Je suis du genre sur-parenthésé ... au moins cela me rassure

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utilisation pointeurs et structures
    Par vincenet dans le forum C
    Réponses: 10
    Dernier message: 16/04/2014, 15h43
  2. Réponses: 2
    Dernier message: 21/03/2007, 10h55
  3. Réponses: 3
    Dernier message: 20/11/2005, 20h04
  4. utilisation d'une structure
    Par charonDZenfer dans le forum C++
    Réponses: 8
    Dernier message: 23/08/2004, 16h21
  5. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 13h19

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