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 :

Syntaxe correcte ?


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut Syntaxe correcte ?
    Bonjour,

    en voulant réviser mes structures de données, je suis tombé sur ceci


    Dans la fonction pour dépiler, dans les explication on a le fait de vérifier si la pile est vide ou non.

    Dans le corps de la fonction il y a

    Je pense qu'il s'agit d'une coquille, et que la bonne syntaxe est la seconde sans le pointeur ?



    Une autre ligne me laisse dubitatif car je n'avais jamais vu cette syntaxe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    free(*p_pile), *p_pile = NULL;
    Indépendamment l'une des autres, je comprends que free va libérer l'espace occupé par le top de la pile et que par la suite on va faire pointer ce top à NULL qui n'existe plus.

    Mais là les deux sont utilisés sur la même ligne séparé par une virgule, je n'avais jamais vu ça auparavant, ce qui fait que du coup j'ai du mal à comprendre l'instruction


    Merci d'avance !

  2. #2
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Il nous manque du code pour etre vraiment capable de pouvoir t'expliquer. Voici quelques exemples pour que tu puisses comprendre :

    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
    typedef struct {
      void *ptr;
      void *next;
    } p_pile;
     
    void  free_element(p_pile **p)
    {
      p_pile *tmp;
     
      if (*p == NULL)
        return;
      tmp = *p->next;
      free(*p->next);
      *p = tmp;
    }
     
    p_pile *free_element(p_pile *p)
    {
      p_pile *tmp;
     
      if (p == NULL)
        return p;
      tmp = p->next;
      free(p);
      return tmp;
    }
    En gros, cette syntaxe :

    revient a demander la valeur a l'adresse ptr. Donc non, il n'y a pas de coquilles dans ce tuto. Peut-etre devrais-tu aller relire le chapitre sur les pointeurs pour bien comprendre tout ca.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    On s'est mal compris je pense

    Regarde la partie Retrait d'un élément: 1 Vérifier si la pile n'est pas vide

    Cela nous donne comme vérification
    Et la fonction complète
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int pile_pop(Pile **p_pile)
    {
        int ret = -1;
        if (p_pile != NULL)
        {
            Pile *temporaire = (*p_pile)->precedent;
            ret = (*p_pile)->donnee;  
            free(*p_pile), *p_pile = NULL;
            *p_pile = temporaire;
        }
        return ret;
    }
    Nous donne comme vérification


  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 371
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 371
    Points : 23 626
    Points
    23 626
    Par défaut
    Bonjour,

    En ce qui concerne la pile, les deux expressions sont valides mais elles ne servent pas à la même chose. « p_pile » est un pointeur, qui peut être initialisé ou pas. Et visiblement, ce pointeur pointe d'autres pointeurs (parce que ta pile doit contenir des pointeurs).

    Écrire :
    … permet de vérifier que ton pointeur de pile est valide et qu'on peut donc l'utiliser en toute sécurité. Écrire :
    … permet de vérifier si l'élément actuellement pointé par ton pointeur de pile (donc celui qui est au sommet) est un pointeur NULL. Cette valeur est probablement une sentinelle qui ne bouge jamais mais qui permet de savoir quand on a atteint le fond de la pile et que, donc, celle-ci est vide. Le premier corollaire à tout cela est qu'il est donc nécessaire de vérifier la première expression avant d'appeler la seconde.

    Une autre façon de présenter ça consiste à dire que la seconde expression te permet de savoir si ta pile est vide ou non, alors que la première t'indique si ta pile existe ou non.

    Mais là les deux sont utilisés sur la même ligne séparé par une virgule, je n'avais jamais vu ça auparavant, ce qui fait que du coup j'ai du mal à comprendre l'instruction.
    C'est une formule fréquemment utilisée lorsqu'on libère de la mémoire.

    Dans ce contexte précis (on trouve la virgule dans d'autres expressions complètement différentes), il s'agit de « l'opérateur virgule ». C'est un opérateur comparable à « && » ou « || », ou encore à l'opérateur ternaire « ?: », dans le sens où il s'agit d'une expression évaluable insécable. Comme pour « && » ou « || », le premier terme (à gauche) va être évalué, puis le second et enfin, l'expression entière prend la valeur de l'élément de droite. Autre détail important : un point de séquence est introduit entre les deux. Le fait d'embarquer le tout dans une même expression introduit un semblant d'atomicité, censé te garantir que la libération de la mémoire puis la remise à zéro du pointeur correspondant se feront bien en une fois. Par exemple, tu ne devrais pas pouvoir poser un breakpoint de déboguage entre les deux. En pratique, c'est à vérifier.

    Ça permet d'expliquer également les effets d'une erreur plus anecdotique, que l'on rencontre parfois :

    Tout ceci compilera très bien et sans erreur mais, à l'exécution, x vaudra « 14 ». C'est dû au fait qu'en C, la virgule n'est pas l'équivalent du point décimal anglo-saxon, mais reste un opérateur tout-à-fait légal.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 754
    Points : 376
    Points
    376
    Par défaut
    Ok sa roule merci !

  6. #6
    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 519
    Points
    41 519
    Par défaut
    Je pense que le problème vient d'un choix douteux de convention de nommage, quand on a une variable type **p_pile.
    Un nom du genre ChainonPile **ppSommetPile serait bien plus explicite et illustre mieux le fait d'avoir deux niveaux d'indirection.
    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. [URL-REWRITING] syntaxe correcte
    Par Slici dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 24/05/2010, 14h39
  2. Syntaxe correcte dans phpmyadmin mais incorrecte en php
    Par Shinoda00 dans le forum Requêtes
    Réponses: 1
    Dernier message: 07/07/2009, 16h56
  3. Probléme syntaxe - correction
    Par Rifton007 dans le forum Flash
    Réponses: 2
    Dernier message: 15/06/2008, 15h28
  4. [RegEx] Syntaxe correcte ?
    Par hedgehog dans le forum Langage
    Réponses: 2
    Dernier message: 15/02/2007, 13h07
  5. Réponses: 3
    Dernier message: 31/03/2006, 08h47

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