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 :

Que signifie cette syntaxe ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut Que signifie cette syntaxe ?
    Bonjour tout le monde,

    Je suis tombé sur une erreur de syntaxe dans une portion de code de mon projet. Après vérification à l'aide de ma gestion de conf, il s'avère que le développeur a simplement introduit "une erreur" par faute de frappe. L'appel a une fonction a tout simplement était changé pour passer de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned long loc_ul_result = Fonction_Toto( arg1, arg2, &arg3) ;
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned long loc_ul_result = *( arg1, arg2, &arg3) ;
    Bon, il s'agit d'une faute de frappe certes, mais qui passe à la compilation sans erreur ni warning, et qui a pour but de toujours renvoyer NULL.

    Que signifie cette syntaxe barbare ?
    On utilise Visual C++ 6 pour ce projet, est-ce une abération du compilateur, est-ce que sous GCC ca compilerait ?

    Est-ce un pointeur sur une fonction toujours nulle (jamais déclarée) donc utilisée certes mais lorsque l'on déréférence cette fonction à l'aide de "*" ça nous renvoie l'adresse mémoire 0x00000000 d'une fonction soit NULL ?

    Cette question est juste par simple curiosité de développeur C++ (d'ailleurs, pour le coup, c'est du C, pas du C++ !), sachant que le problème a bien été résolu (la portion de code sous jacente au retour n'était jamais prise en compte !).

    Merci a vous.
    Alex.

  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
    Il me semble que cela se résoud en "unsigned long loc_ul_result = arg3;"
    Ne pas oublier que la virgule est un séparateur d'expression, on a donc:
    • (arg1, arg2, &arg3) qui évalue arg1 et arg2 et retourne &arg3
    • *(&arg3) qui retourne arg3.
    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 confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    Merci,

    mais si cela revenait à "unsigned long loc_ul_result = arg3;", alors je n'aurais jamais en retour 0x00000000 comme là. J'aurais la valeur de arg3, qui lui est bien initialisé, a moins que tu ne veuilles dire que arg3 prends la valeur de l'expression des deux précédents arguments, mais alors quoi ? Par quelle opération logique sont évalués arg1 et arg2 ?

    arg3 = arg1 && arg2 ?

    Merci pour votre aide.

  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
    Non, pas d'opération compliqué. Si c'est ce que je pense, la valeur aurait bien dû être celle de arg3, qui n'aurait pas été modifié par cette ligne.

    Je peux aussi m'être trompé, mais es-tu sûr que c'est bien arg3 qui est initialisé à une valeur non-nulle, et non pas juste &arg3 ?
    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
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Je peux aussi m'être trompé
    Non, le raisonnement est correct.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int c1 = 1, c2 = 2, c3 = 3;
    int x = *(c1, c2, &c3);
    x vaut bien 3.

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2002
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 200
    Par défaut
    Merci pour votre aide. J'ai fait ce meme test au meme moment, effectivement les arguments avant le dernier argument sont évalués sans conséquence !

    Ce qui m'avait induit en erreur c'était que le dernier arguement était toujours initialisé à 0 (evidemment !), donc casté en false pour l'évaluation de mon code de retour !

    D'ailleurs, pour simplifier,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int c1 = 1, c2 = 2, c3 = 3;
    int x = (c1, c2, c3);
    fait la meme chose.
    D'ou ma question, a quoi peut bien servir cette syntaxe prévu dans le C ? En trouve t on un exemple concret, ou c'est une subtilité du compilateur (un effet de bord...) juste pour le fun ?
    De plus, ca marche sous GCC aussi ?
    Pourquoi les createurs du langage ont ils prévu un tel cas, qui ne sert a rien apparemment ?

    Merci.

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

Discussions similaires

  1. Que signifie cette syntaxe ?
    Par Triste dans le forum Débuter
    Réponses: 4
    Dernier message: 08/11/2007, 15h00
  2. Que signifie cette syntaxe de code ?
    Par SPACHFR dans le forum C
    Réponses: 4
    Dernier message: 02/05/2007, 13h24
  3. Que signifie cette erreur de compilation ?
    Par Premium dans le forum C
    Réponses: 14
    Dernier message: 22/05/2006, 23h16
  4. [SQL-Server] 'Bad column offset' que signifie cette erreur ?
    Par dor_boucle dans le forum PHP & Base de données
    Réponses: 20
    Dernier message: 08/02/2006, 15h01
  5. [SQL][DERBY] Que signifie cette erreur ?
    Par irenee dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/12/2005, 14h34

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