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

Langage C++ Discussion :

Précision sur la syntaxe d'un test


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut Précision sur la syntaxe d'un test
    Bonjour à toutes et à tous,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void TinyGPS::get_position(long *latitude, long *longitude)
    {
      if (latitude) *latitude = _latitude;
      if (longitude) *longitude = _longitude;
    }
    A quoi servent les tests "if (latitude)" et "if (longitude)" ? Cela sert-il simplement à savoir si les variables "latitude" et "longitude" existent vraiment, c'est-à-dire qu'elles ne pointent pas sur NULL.

    Merci pour vos précisions.

    Pierre

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Cela sert en effet à tester si les pointeurs sont non-nuls (et donc, s'il est possible d'écrire sur leur destination sans danger).

    Personnellement, bien qu'ayant longtemps été partisan de cette écriture, j'ai fini par comprendre qu'écrire explicitement if(pointeur != nullptr) donnait un code plus compréhensible; de nos jours je réserver if(valeur) aux valeurs réellement booléennes.
    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.

  3. #3
    Membre émérite
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 79
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 122
    Par défaut
    Merci pour cette précision.

    Dans un code où sont explicitement définies mes variables, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TinyGPS gps;
     
    long lat, lon;
    ...
    gps.get_position(&lat, &lon);
    je ne vois vraiment pas l'utilité de ce test.

    Cordialement.

    Pierre

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Mais la fonction ne sait pas qu'elle ne va jamais être appelée avec des pointeurs non-nuls (à moins d'être private, auquel cas celui qui implémente la classe peut s'en assurer).

    Il y a aussi la possibilité de passer les paramètres par référence plutôt que par pointeur, mais le passage par référence non-constante "silencieux" (i.e. avec la même syntaxe que le passage par valeur) de C++ me met mal à l'aise (quand je passe un int directement à une fonction, je ne m'attends pas à ce qu'elle le modifie). Je prèfère largement la syntaxe du C# à ce sujet, où le passage par référence est explicite.
    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.

  5. #5
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Cela me fait penser à l'article "Y a-t-il une raison pour laquelle les fonctions ne retournent qu'une seule valeur dans la plupart des langages de programmation ?"
    Lien : http://www.developpez.com/actu/89847...agez-vos-avis/

    Personnellement, je n'aime pas ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void TinyGPS::get_position(long *latitude, long *longitude)
    {
      if (latitude) *latitude = _latitude;
      if (longitude) *longitude = _longitude;
    }
    La latitude et la longitude sont directement disponibles en tant que variables membres. Donc je ne vois pas de bonne raison que cette fonction existe au lieu d'être découpée en deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    long TinyGPS::get_latitude() const // ne pas oublier const
    {
        return _latitude;
    }
     
    long TinyGPS::get_longitude() const // ne pas oublier const
    {
        return _longitude;
    }
    Pas de problème de pointeur nul.
    Pas de problème de passage par référence non-constante "silencieux".

    Et même si la latitude et la longitude n'étaient pas directement disponibles en mémoire mais le résultat d'un calcul lancé par la fonction TinyGPS::get_position, alors une solution aurait été que cette fonction retourne un objet contenant la latitude et la longitude :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TinyGPS gps;
    // ...
    TinyGPS::Position position = gps.get_position();
    long lat = position.get_latitude();
    long lon = position.get_longitude();

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par ChPr Voir le message
    A quoi servent les tests "if (latitude)" et "if (longitude)" ? Cela sert-il simplement à savoir si les variables "latitude" et "longitude" existent vraiment, c'est-à-dire qu'elles ne pointent pas sur NULL.
    Petit point de vocabulaire, à la limite du pinaillage, mais la réponse suivant me laisse penser qu'il y a peut être une légère confusion. Dans ta fonction, latitude et longitude existent, ce n'est pas une option. Et ce sont deux variables de type pointeur pointeur sur long. Le test a pour but de vérifier si ces pointeurs pointent sur de la vraie mémoire ou pas, ce dernier cas étant indiqué par la valeur conventionnelle nullptr.
    Citation Envoyé par ChPr Voir le message
    Dans un code où sont explicitement définies mes variables, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TinyGPS gps;
     
    long lat, lon;
    ...
    gps.get_position(&lat, &lon);
    je ne vois vraiment pas l'utilité de ce test.
    Dans ce code globalement, le test ne sert à rien, et il est possible qu'un bon compilateur le supprime complètement. Mais la fonction get_position est susceptible d'être appelée dans d'autres contextes, où le test pourrait voir une utilité (même si je n'aime pas cette écriture, mais c'est un autre sujet...).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Dans ce code globalement, le test ne sert à rien, et il est possible qu'un bon compilateur le supprime complètement.
    ...à condition que la fonction TinyGPS::get_position soit en ligne.

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Certains compilateurs sont capable d'optimiser ça même si la fonction n'est pas inlinée. Ca s'appelle généralement whole program optimisation, ou link time optimisation. Ce qui revient en fait à prendre des décisions d'inlining à postériori. Là où ça résiste, c'est quand il y a une frontière de bibliothèque dynamique entre les deux (ce qui est une bonne raison de ne pas utiliser de .DLL/.so sauf là où c'est nécessaire).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Il faut voir le cas d'utilisation réel de la fonction get_position, mais, si on s'attend à ce que l'utilisateur de cette fonction transmette forcément un pointeur aussi bien pour la longitude que pour la latitude (comprend : qu'il n'ait pas d'autre choix que de récupérer les deux de manière systématique), nous pourrions partir du principe que, lorsque l'utilisateur de la fonction ne transmet que la longitude (ou que la latitude, ou pire encore, aucun des deux), c'est forcément une erreur de programmation.

    Il pourrait alors s'avérer intéressant d'utiliser carrément une assertion, afin que le mode debug nous indique clairement les appels à la fonction qui ne "respectent pas les règles". (note au passage que le passage par référence est aussi en mesure de nous apporter cette garantie)
    Ainsi, nous pourrions très bien avoir quelque chose qui ressemblerait à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void TinyGPS::get_position(long *latitude, long *longitude)
    {
      assert(latitude!=nullptr && "No latitude destination");
      assert(longitude!=nullptr && "No longitude destination");
      *latitude = _latitude;
      *longitude = _longitude;
    }
    Mais bien sur, cela implique que... ni la longitude ni la latitude ne sont optionnelles
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 769
    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 769
    Par défaut
    Citation Envoyé par ChPr Voir le message
    A quoi servent les tests "if (latitude)" et "if (longitude)" ? Cela sert-il simplement à savoir si les variables "latitude" et "longitude" existent vraiment, c'est-à-dire qu'elles ne pointent pas sur NULL.
    Ce sont des simplifications C de tests 0, zéro - NULL - false

    • if (XXX) { /**/ } équivaut à if (XXX != 0/ NULL/ false) { /**/ }
    • if (!XXX) { /**/ } équivaut à if (XXX == 0/ NULL/ false) { /**/ }

Discussions similaires

  1. Précision sur Oracle 9iAS r2
    Par Patmane dans le forum Oracle
    Réponses: 9
    Dernier message: 18/03/2007, 04h41
  2. [XPath] petite précision sur type de syntaxe
    Par Royd938 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 15/06/2006, 12h13
  3. Précisions sur Import/export
    Par electro dans le forum Import/Export
    Réponses: 9
    Dernier message: 15/10/2004, 13h34
  4. [Observateur] Précisions sur le design pattern Observer [UML]
    Par joquetino dans le forum Design Patterns
    Réponses: 2
    Dernier message: 07/10/2004, 22h35
  5. Précision sur les sauvegarde à chaud
    Par alxkid dans le forum Administration
    Réponses: 2
    Dernier message: 09/08/2004, 18h55

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