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

Bibliothèque standard C Discussion :

Cast non implicite entre int* et void* quand le pointeur est paramètre d'une fonction


Sujet :

Bibliothèque standard C

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Cast non implicite entre int* et void* quand le pointeur est paramètre d'une fonction
    Bonjour,

    en C il y a des casts implicites entre "void*" et les autres types de pointeurs que ce soit dans des affectations directes, ou lors du passage en paramètre à une fonction .
    En revanche le cast implicite dans le cas du passage de paramètre n'est plus valable quand c'est un pointeur vers la fonction qui est considéré :
    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
    27
    28
    #include <stdlib.h>
     
    void f(int* p)
    {
    	p = NULL;
    	return;
    }
     
    void fp(void (*p)(void*))
    {
    	p = NULL;
    	return;
    }
     
    int main(void) 
    {
    	void* p_void = NULL;
     
    	int* p_int = p_void;
    	p_void = p_int;
     
    	f(p_void);
    	f(p_int);
     
    	fp(f);
     
    	return EXIT_SUCCESS;
    }
    Les casts implicites par affectations directes ne provoquent pas de warnings :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int* p_int = p_void;
    p_void = p_int;
    Les casts qui ont lieu lors du passage en paramètre non plus :
    En revanche la ligne :
    provoque le warning de compilation suivante avec gcc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    warning: passing argument 1 of ‘fp’ from incompatible pointer type
    Pourquoi le système de typage devient il aussi restrictif au niveau du typage des fonctions ?

    A priori la fonction "f" peut être invoquée indifferemment avec "int*" ou "void*" .

    Merci .
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ce n'est pas un cast entre int* et void* : C'est un cast entre void (*)(void*) et void (*)(int*), qui sont deux types radicalement différents.

    Même en C++ avec des classes dérivées, il faut un cast explicite "dur": Les types sont trop différents pour autoriser un cast implicite...
    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 expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ce n'est pas un cast entre int* et void* : C'est un cast entre void (*)(void*) et void (*)(int*), qui sont deux types radicalement différents.
    Oui bien sûr mais l'appel de "f" à travers un pointeur ou directement ne devrait il pas se comporter de la même façon et donc permettre le passage d'un "int*" ou "void*" indifferemment ?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Pour le C, ça ne change rien: Dès qu'un paramètre, est différent, ou la valeur de retour, ce n'est plus le même type de pointeur de fonction.

    Même si la différence se fait entre int et long sur un système 32 bits. Le compilo ne regarde pas l'appel, il regarde les types des pointeurs.
    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 Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Le compilo ne regarde pas l'appel, il regarde les types des pointeurs.
    Pour quelles raisons ?
    Quels problèmes pourrait poser une telle possibilité ?
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par seriousme Voir le message
    Pour quelles raisons ?
    Il n'y a pas de type generique pour les pointeurs de fonction en C.

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Il n'y a pas de type generique pour les pointeurs de fonction en C.
    Le problème n'est pas tant au niveau des pointeurs sur fonction qu'au niveau de l'analyse des paramètres par le compilateur :
    il accepte les casts lors du passage de paramètre direct mais n'accepte pas un type de pointeur de fonction différent, certes, mais qui permettrait à priori des appels de fonction valides .
    Il génère le même warning que lors d'erreurs plus graves comme le passage d'un pointeur sur une fonction avec un mauvais nombre de paramètres .
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par seriousme Voir le message
    il accepte les casts lors du passage de paramètre direct mais n'accepte pas un type de pointeur de fonction différent, certes, mais qui permettrait à priori des appels de fonction valides .
    Le compilateur ne parie pas. fp() attend un void (*)(void*), on lui donne un void (*)(int*). Comme le prototype de fp() est en vue, la norme exige du compilateur qu'il avertisse que l'argument n'est pas du type attendu. Si tu sais ce que tu fais, tu peut caster f dans l'appel a fp(), mais ca commence a etre acrobatique.

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

Discussions similaires

  1. Recevoir un int php en paramètre dans une fonction javascript
    Par student_php dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/10/2010, 12h40
  2. Souligner un JLabel quand le pointeur est au dessus
    Par Polux000 dans le forum Composants
    Réponses: 2
    Dernier message: 15/12/2008, 15h25
  3. Détecter quand le pointeur souris sort d'une APP.
    Par Bighobbit dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 06/10/2006, 17h49
  4. Affichage d'une image avec changement quand le pointeur est dessus
    Par mauriiice dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 04/09/2006, 20h21
  5. [Débutant]#entre int main & void main
    Par Binga dans le forum C
    Réponses: 9
    Dernier message: 10/08/2004, 15h54

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