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

  1. #1
    Nouveau Candidat au Club
    Orthographe pour enchainer les pointeurs
    Bonjour
    Je m'amuse à coder une liste chaînée entièrement fonctionnelle (avec des fonctions pouvant créer, ajouter, supprimer des éléments n'importe où etc) pour m'améliorer en C.
    J'ai réussit, mais j'ai une question :
    Pour accéder à un élément dans une structure alloué dynamiquement on utilise l'expression
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    element=(*ma_structure).mon_element
    , qui est équivalente à
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    element=ma_structure->mon_element

    Personnellement je préfère de loin la 1ère orthographe, comme ça je ne perd pas de vue qui est un pointeur, qui est une variable, etc, et aussi parce que la flèche est de l'autre coté de l'* utilisée d'habitude pour les pointeurs et ça me perturbe. Mais essayant de manipuler les éléments de ma liste chaînée je me suis aperçu d'un soucis : cela ne marche que pour le 1er pointeur. Si je tente par exemple de faire
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    element_numero_2=(*ma_liste_chainee).(*first_element).(*next).mon_element
    Le compilateur n'est pas très très gentil, et me répond invariablement :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ gcc -g3 main_liste_chainee.c bool.c -o main_liste_chainee.console
    main_liste_chainee.c: In function ‘main’:
    main_liste_chainee.c:14:24: error: expected identifier before ‘(’ token
       14 |  a=(*ma_liste_chainee).(*first).b;
          |                        ^

    J'ai essayé de mettre des parenthèses un peu partout mais rien à faire : seule deux orthographes fonctionnent :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    element_numero_2=(*ma_liste_chainee).first_element->next->mon_element
    element_numero_2=ma_liste_chainee->first_element->next->mon_element

    Est ce que vous sauriez comment conserver l'orthographe
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    element_numero_2=(*ma_liste_chainee).(*first_element).(*next).mon_element
    ??
    Cordialement ^^

  2. #2
    Expert confirmé
    Citation Envoyé par f.andre Voir le message
    J'ai essayé de mettre des parenthèses un peu partout mais rien à faire
    Plutôt qu'essayer partout, il vaut bien mieux prendre le temps de réfléchir.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    element_numero_2 = (*(*(*ma_liste_chainee).first_element).next).mon_element

  3. #3
    Expert éminent
    Citation Envoyé par dalfab Voir le message
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    element_numero_2 = (*(*(*ma_liste_chainee).first_element).next).mon_element
    Et pourquoi pas
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    element_numero_2 = (((ma_liste_chainee->first_element)->next)->mon_element);


    ou peut-être
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    element_numero_2 = (*(*(*ma_liste_chainee.first_element).next).mon_element);



    @f.andre tu veux un scoop
    Ce code c'est de la méga grosse chias*e parce que comme tu as plusieurs déréférencements enchaînés dont tu ne testes pas le retour, tu ne sais pas lequel plante (et tu ne sais pas non plus, combien plante )

  4. #4
    Expert éminent sénior
    Bonjour
    Citation Envoyé par f.andre Voir le message
    Pour accéder à un élément dans une structure alloué dynamiquement on utilise l'expression element=(*ma_structure).mon_element, qui est équivalente à element=ma_structure->mon_element
    Pas forcément allouée dynamiquement. Tu peux très bien par exemple avoir une truc style struct s_toto var puis passer &var à une fonction laquelle stockera ce &var dans un pointeur (ex struct s_toto *pt) qui devra alors, s'il doit accéder à un membre "mbr" utiliser la notation pt->mbr.

    Citation Envoyé par f.andre Voir le message
    Personnellement je préfère de loin la 1ère orthographe
    Tu es le tout premier que je vois dire ça. La notation "flèche" a justement été introduite pour simplifier l'écriture première qui nécessitent des parenthèses. A mon avis, ça va vite te gonfler de devoir en mettre chaque fois que tu veux accéder à un membre d'une structure pointée (surtout quand je vois les solutions offertes pour ta demande complète). Et comment feras-tu si le "mbr" dont j'ai parlé plus haut est lui-même un pointeur et que tu veux accéder à la case sur laquelle il pointe ? La notation "habituelle" serait alors *pt->mbr (l'étoile s'applique alors à "mbr" et non à "pt"). Est-ce que toi tu vas écrire *(*pt).mbr ???

    Citation Envoyé par f.andre Voir le message
    comme ça je ne perd pas de vue qui est un pointeur, qui est une variable, etc,
    Erreur de vocabulaire, car tout est variable. Certaines sont variables "int", certaines sont "float", et certaines sont "pointeur". On s'y fait.

    Citation Envoyé par f.andre Voir le message
    et aussi parce que la flèche est de l'autre coté de l'* utilisée d'habitude pour les pointeurs et ça me perturbe.
    Ca je te l'accorde. La flèche indique que le pointeur est avant elle. Mais comme je l'ai dit, je pense que tu t'y feras. Tu peux aussi te dire "structure pointée" comme je l'ai fait un peu plus haut.
    Sinon pour ta question principale, dalfab et foetus y ont répondu. element_numero_2 = (*(*(*ma_liste_chainee).first_element).next).mon_element. J'espère que "mon_element" n'est pas lui-même un pointeur sur une autre structure...
    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

  5. #5
    Expert éminent sénior
    Sinon, en se rappelant le récit de l'opérateur sproing, on doit aussi pouvoir déréférencer ces pointeurs en utilisant la notation tableau:
    Code C :Sélectionner tout -Visualiser dans une fenêtre à part
    element_numero_2=ma_liste_chainee[0].first_element[0].next[0].mon_element

    Tu me diras que là encore, c'est "du mauvais côté" par rapport à l'étoile. Mais tout comme la "flèche", ça permet de mettre l'opérateur entre les éléments plutôt que tout accumuler à gauche en empilant les parenthèses.

    À noter aussi que ça complique la lecture et la compréhension du code, car quand on voit la notation tableau utilisée, on s'attend (ici, à tord) à ce que le pointeur pointe sur plusieurs éléments (même si le [0] hard-codé réduit quand-même considérablement le problème).
    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.