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 :

pointeur vers une structure


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 4
    Points
    4
    Par défaut pointeur vers une structure
    bonjour a tous,


    je dois realiser un projet en C et l'utilisation des pointeurs est souhaitee...

    voici mon probleme:

    - l'entete de ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void nomDeFonction (struct chainon **first,...autres params....)
    - la structure chainon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct chainon{ char nomPre[40];
                                char numTel[14];
                                struct chainon *ptrSvt;
                             };
    - l'instruction dans la fonction qui pose probleme:

    ce qui se passe, c'est qu'à la compilation il me marque:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pointer to structure required on left side of -> or ->*

    est-ce que quelqu'un peu eclairer ma lanterne???

    merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut Re: pointeur vers une structure
    Citation Envoyé par Xyrroa
    (*first)->ptrSvt = NULL;

  3. #3
    Membre habitué Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 162
    Points
    162
    Par défaut Re: pointeur vers une structure
    Citation Envoyé par Xyrroa
    - l'entete de ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void nomDeFonction (struct chainon **first,...autres params....)
    - la structure chainon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct chainon{ char nomPre[40];
                                char numTel[14];
    Pourquoi vous avez déclaré dans votre fonction struct chainon **first normalement vous devez déclaré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     void nomDeFonction( struct chainon *first, .........);
    est le traitement sera fait comme vous l'avez fait :
    Revisez votre cours de listes chainées.

    Citation Envoyé par Skyrunner
    (*first)->ptrSvt = NULL;
    Ce type de déclaration n'existe pas je pense.
    je pense que vous voulez écrire :

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut Re: pointeur vers une structure
    Citation Envoyé par ccensam
    Citation Envoyé par Xyrroa
    - l'entete de ma fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void nomDeFonction (struct chainon **first,...autres params....)
    - la structure chainon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct chainon{ char nomPre[40];
                                char numTel[14];
    Pourquoi vous avez déclaré dans votre fonction struct chainon **first normalement vous devez déclaré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     void nomDeFonction( struct chainon *first, .........);
    Non, le P.O. a passé un double pointeur pour pouvoir éventuellement modifier la valeur de la tête de liste.

    Citation Envoyé par ccensam
    Revisez votre cours de listes chainées.
    effectivement
    Pense aussi à revoir ton cours sur les pointeurs

    Citation Envoyé par ccensam
    Citation Envoyé par Skyrunner
    (*first)->ptrSvt = NULL;
    Ce type de déclaration n'existe pas je pense.
    Ben si justement, quand on passe un "double pointeur" ou pointeur de pointeur.

  5. #5
    Membre habitué Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 162
    Points
    162
    Par défaut Re: pointeur vers une structure
    Citation Envoyé par Trap D
    Non, le P.O. a passé un double pointeur pour pouvoir éventuellement modifier la valeur de la tête de liste.
    J'arrive pas à comprendre l'utilité de cette déclaration. Est-ce quelqu'un peu m'expliquez davantage svp.

  6. #6
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    si je passe l'argument comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void nomDeFonction(struct chainon *first,..)
    l'adresse vers laquelle pointe "first" passe par copie, et donc, meme si je la modifie dans la fonction, au retour à la fonction principale, ma nouvelle valeur de tete de liste ne sera pas "sauvegardee", j'aurai la meme adresse de tete de liste qu'avant d'appeler ma fonction

    c'est pourquoi je declare ma fonction comme cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void nomDeFonction(struct chainon **first,..)

    je vais toujours essayer la solution de SkyRunner.

    Merci.

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ce qui se fait couramment est cec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct chainon *nomDeFonction(struct chainon *first,..)
    qui permet de renvoyer la valeur de la tete de liste (et donc éventuellement de la modifier).

  8. #8
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    la seule chose pour laquelle je peux utiliser les "return" c'est dans le cas d'une erreur rencontree lors du traitement.
    je retourne le "code erreur" au niveau superieur via le return

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Xyrroa
    la seule chose pour laquelle je peux utiliser les "return" c'est dans le cas d'une erreur rencontree lors du traitement.
    je retourne le "code erreur" au niveau superieur via le return
    Faux problème. Pointeur NULL = ERREUR.

    C'est comme ça que fonctionnent malloc(), fopen()... et des millions d'ADT dans le monde...

    Dans le pire des cas (ok, liste chainée, arbre...), On peut passer un paramètre de retour (l'adesse d'une variable 'erreur'...), ou placer l'erreur dans un champ de la première structure...

    Mais éviter le double pointeur est une Bonne Chose.

  10. #10
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    non, si je mets NULL c'est pour une bonne raison.

    en fait je dois ajouter un chainon dans une liste chainee. je teste la valeur de la tete de la liste;

    si elle vaut NULL, l aliste est vide et j'ajoute donc un nouveau chainon. Comme ce chainon n'a pas de successeur, je mets sont pointeur vers le chainon suivant a NULL, d'où l'instruction
    si par contre la liste n'est pas vide, je changer mes pointeurs de facon a inserer le nouveau chainon comme tete de liste et l'ancienne tete de liste devient le successeur de mon nouveau chainon

    J'espere que malgré ce charabiat tu comprends mon raisonnement...


    P.S: j'ai essayé la soluce de Skyrunner, mais ca ne fonctionne pas.
    merci quand meme.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Xyrroa
    non, si je mets NULL c'est pour une bonne raison.
    Oui, bien sûr, je parlais du retour de la fonction...

    OK, je comprends pourquoi tu passes l'adresse du pointeur. Mais c'est une pratique assez lourde..

    Dans l'industrie, on utilise une structure 'liste' qui contient le pointeur de tête et, tant qu'à faire, le pointeur de queue (ça évite les boucles inutiles pour ajouter en fin de liste : acces direct) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct list
    {
       struct node *p_head;
       struct node *p_tail;
    };
    On passe alors à la fonction un struct list *p_list, et tout devient simple et clair...

  12. #12
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    grosse crevette trisomique que je suis!!!!!

    je l'ai trouvee cette foutue erreur qui me casse les bonbons....

    code pourri:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct chainon{ char nomPre[40];
                            char numTel[40];
                            chainon *ptrSvt;
                          }chainon;
    code corrigé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct chainon{ char nomPre[40];
                            char numTel[40];
                            STRUCT chainon *ptrSvt;
                          }chainon;
    Désolé Skyrunner, ta solution fonctionne à merveille avec ma nouvelle déclaration...

    merci de votre aide.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Xyrroa
    code corrigé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct chainon{
    <...>
                            STRUCT chainon *ptrSvt;
                          }chainon;
    Pas de STRUCT en C...

  14. #14
    Candidat au Club
    Inscrit en
    Février 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Xyrroa
    code corrigé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct chainon{
    <...>
                            STRUCT chainon *ptrSvt;
                          }chainon;
    Pas de STRUCT en C...

    je voulais dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct chainon{ char nomPre[40]; 
                            char numTel[40]; 
                            struct chainon *ptrSvt; 
                          }chainon;
    je sais pas si ca change quelque chose pour toi, mais moi c'est comme ca que j'ai vu les structures autoreferentielles au cours

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Xyrroa
    je voulais dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct chainon{ char nomPre[40]; 
                            char numTel[40]; 
                            struct chainon *ptrSvt; 
                          }chainon;
    OK. Ça, c'est du C.
    je sais pas si ca change quelque chose pour toi, mais moi c'est comme ca que j'ai vu les structures autoreferentielles au cours
    C'est une façon de faire, oui.

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

Discussions similaires

  1. Utilité d'un pointeur vers une fonction ?
    Par Nasky dans le forum C
    Réponses: 10
    Dernier message: 20/03/2010, 19h54
  2. Pointeur vers une table dans une fonction
    Par Chatbour dans le forum Oracle
    Réponses: 2
    Dernier message: 03/05/2007, 12h28
  3. Réponses: 67
    Dernier message: 13/02/2007, 18h08
  4. Réponses: 10
    Dernier message: 02/01/2007, 10h17
  5. Réponses: 2
    Dernier message: 26/11/2006, 10h51

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