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 :

warning sur conversion de pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Par défaut warning sur conversion de pointeurs
    Bonjour,
    Voici un bout de code qui me renvoie un warning ("compiler dependent") sur la conversion d'un pointeur de fonction en pointeur de données. Ici, il ne faut pas prendre cet exemple pour argent comptant. Ma question est plus générale : Comment convertir "proprement" des pointeurs quels qu'ils soient ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(void)
    {
        unsigned char *MyPointer;
        MyPointer = (unsigned char*) &main;
        (void) printf("%.2X\n", *MyPointer);
        return 0;
    }
    merci d'avance

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Pour les pointeurs autres que pointeurs de fonctions, la seule conversion parfaitement sure est void * <-> type *. Pour les autres conversions, il faut savoir ce que l'on fait.
    Pour les pointeurs de fonctions, il n'existe pas de pointeur generique.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Par défaut
    si je vous comprends bien, je ne peux pas éviter le warning ?
    Là où je ne saisis pas bien la chose, c'est en quoi ce genre de conversions dépendent du compilateur ? Que peut-il se passer si on change de compilo ?

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Tu es dans le domaine du comportement indefini (ou peut-etre implementation-dependent, je ne suis pas sur), donc tout peut arriver, y compris un comportement normal.
    Pour corriger le code que tu postes, il faut declarer MyPointer comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int (*MyPointer)(void);
    et tout ira bien.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Par défaut
    ok. Le problème est que si je déclare MyPointer comme pointeur de fonction, si je veux ensuite qu'il pointe vers une autre fonction qui n'a pas le même prototype que 'main', je suis marron. Mon idée ici était de disposer d'un pointeur générique (void* ou char*) utilisable par exemple dans une fonction qui ne se soucie pas du type de pointeur qui lui est transmis. Cette transmission est sous la responsabilité de l'utilisateur. Mais s'il y a des warnings à chaque fois, c'est sujet à questionnements de la part de ces dits utilisateurs (alors même qu'il n'y a pas d'erreur).
    Donc :
    Si je déclare MyPointer en void*, j'ai le warning quoiqu'il arrive.
    Si je déclare MyPointer en int(*)(void), je ne peux pointer que vers des fonctions avec un tel proto.
    C'est une restriction propre à la norme C99 peut-être. Si le compilo respecte la norme, y a pas de souci et dans le cas contraire, comportement indéfini...enfin, je dis ça, je suis peut-être complètement à côté de la plaque

  6. #6
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Ce n'est pas propre au C99. Regarde le warning que j'ai, ça devrait t'éclairer un peu plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    warning: ISO C forbids conversion of function pointer to object pointer type
    ISO C ne fait pas référence à C99 !

  7. #7
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Comme je l'ecris plus haut, il n'y a pas de pointeur de fonction generique, donc tu es en effet "marron".
    Il y a une solution cependant, voir ici.
    D'autres solution incluent l'utilisation d'une fonction wrapper qui se charge des differences de prototype.

    Je te conseille de lire cette reponse de Eric Sosman dans c.l.c, c'est un excellent resume du probleme et de ses solutions.

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/01/2013, 15h30
  2. Réponses: 2
    Dernier message: 03/09/2010, 08h39
  3. Warning sur pointeur 64bits
    Par Gui13 dans le forum C
    Réponses: 1
    Dernier message: 13/12/2009, 11h21
  4. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  5. Réponses: 5
    Dernier message: 05/06/2004, 13h12

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