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

GTK+ avec C & C++ Discussion :

Transtypages sur des pointeurs de fonction


Sujet :

GTK+ avec C & C++

  1. #1
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut Transtypages sur des pointeurs de fonction
    --- Sujet original : Interface graphique en C ---

    Citation Envoyé par Médinoc
    Rectification, à présent j'ai quelque chose contre GTK+ : GTK+ semble utiliser à outrance des transtypages sur des pointeurs de fonction.
    Autant pour les structures en C on peut comprendre, autant pour les pointeurs de fonction c'est la porte ouverte à tous les problèmes, et j'ai déjà vu ici un problème dû à ça.

    --> Faire une croix dessus.


    PS: De plus, pour les structures, j'aurais donné deux macros séparées pour l'upcast et le downcast, mais là, c'est l'amateur de "compatibilité C++" qui parle.
    Tu pourrais expliquer un peu ? T'as un exemple ?

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    J'avais un exemple ici même à developpez.net, mais je ne le retrouve plus.

    Il y avait une fonction appelant en boucle un callback qui devait retourner une valeur booléenne (true pour continuer la boucle).
    Il a fallu que j'aille moi-même consulter l'aide sur un site Web pour le découvrir, alors que notre pauvre forumeur désemparé avait déclaré sa fonction comme retournant void.

    Résultat, selon la dernière fonction appelée/dernière opération effectuée, la "fonction" retournait soit 0/FALSE en code normal, soit une valeur non-nulle (TRUE) quand il s'adonnait au printf()-debugging...
    Ainsi, son code foirait "en Release" et pas "en Debug" (entre guillemets car je ne crois pas qu'il utilisait Visual), alors c'était vraiment PITA pour trouver l'origine du problème...

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Un autre problème est souvent rencontré sous Windows, lorsque certains utilisent encore un ancien prototype datant de Win16 pour une WindowProc:
    Code Horrible et vieux : Sélectionner tout - Visualiser dans une fenêtre à part
    LONG FAR PASCAL MaMainProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
    ©mon incompétent prof de Système du BTS.

    Dans un vrai code, on a ceci:
    Code Win32 OK : Sélectionner tout - Visualiser dans une fenêtre à part
    LRESULT CALLBACK ProcDeFenetre(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
    Sachant que UINT fait 32 bits et que WPARAM et LPARAM correspondent respectivement à UINT_PTR et LONG_PTR, qui font tous les deux 32 ou 64 bits selon la plate-forme.
    Quant on sait que du code lit le mot de poids fort du WPARAM, on va droit à la catastrophe.
    ---> Normalement, le compilateur devrait signaler une erreur là-dessus. Ce qu'il fait, quand il n'y a pas un petit malin (ou un vieux con) pour transtyper systématiquement le pointeur de fonction...
    C'est pourquoi selon moi, un pointeur de fonction en C ne doit jamais, au grand jamais, être transtypé.
    (en C++, il y a des cas spéciaux pour les pointeurs de fonctions membres non-statiques).

    Là chose à retenir, c'est qu'en transtypant un pointeur de fonction, on transtype du même coup tous ses paramètres et sa valeur de retour. Et qu'il s'agit d'un transtypage "à la C" (C-Style cast), c'est-à-dire celui qui permet absolument tout et n'importe quoi (changement de type, de taille, et perte de const).
    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 chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    <GTK+>Si quelqu'un veut retourner un booleen et déclare sa fonction en void,
    alors on peut en déduire qu'il faut faire une croix sur GTK parce que GTK+ semble
    utiliser à outrance des transtypages sur des pointeurs de fonction.</GTK+>
    L' année commence bien.

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Si GTK+ n'exigeait pas ainsi des transtypages, le compilo aurait signalé l'erreur, point.
    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 chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Oui! C'est à cause du méchant compilo et de son prof qui est complice!

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    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 393
    Par défaut
    Non, c'est la faut des auteurs d'une bibliothèque qui ont été trop fainéants pour définir plusieurs typedefs différents pour leur callbacks.

    Tu te fous de ma gueule, mais on voit que tu n'as pas encore eu ce genre de problème. L'élément humain est le plus propice aux erreurs, et une erreur sur le type d'une fonction a des effets plus pervers que d'autres.
    Aussi, un bon programmeur prend le minimum de risques...

    Surtout pour une bibliothèque...
    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. probleme sur des pointeurs de pointeurs
    Par frboyer dans le forum Langage
    Réponses: 2
    Dernier message: 14/04/2010, 18h01
  2. Considérations sur les pointeurs de fonctions
    Par deubelte dans le forum C++
    Réponses: 3
    Dernier message: 09/03/2010, 23h25
  3. Réponses: 7
    Dernier message: 02/01/2008, 14h32
  4. souci sur des pointeurs
    Par Caesarus dans le forum Langage
    Réponses: 14
    Dernier message: 19/07/2007, 17h45
  5. [Language]Equivalent Java des pointeurs de fonctions du C/C++
    Par Thierry Chappuis dans le forum Langage
    Réponses: 1
    Dernier message: 25/11/2005, 15h14

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