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 :

Orthographe pour enchainer les pointeurs


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2019
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1
    Points : 1
    Points
    1
    Par défaut 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 éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 642
    Points
    7 642
    Par défaut
    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 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 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
    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
    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 «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]

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    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.

Discussions similaires

  1. Idées de fonctions standards pour manipuler les pointeurs
    Par darkwall_37 dans le forum Débuter
    Réponses: 25
    Dernier message: 20/07/2016, 22h36
  2. Réponses: 4
    Dernier message: 23/12/2008, 10h32
  3. votre recette pour les pointeurs
    Par danielmorgan dans le forum Débuter
    Réponses: 15
    Dernier message: 30/11/2008, 21h00
  4. Réponses: 11
    Dernier message: 03/11/2007, 18h33

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