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 :

Cannot convert from 'bool' to 'bool (__cdecl *)


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut Cannot convert from 'bool' to 'bool (__cdecl *)
    Bonjour,
    J’ai créé une classe dans laquelle je mets un pointeur sur une fonction (dans le .h).
    bool (*MaFonction)(int, bool, bool *, int *);

    Quand j’associe une fonction à ce pointeur à partir d’une autre classe(objet.MaFonction=fonction(var1, var2, var4, var3);) je rencontre cette erreur :
    erreur : C2440: '=' : cannot convert from 'bool' to 'bool (__cdecl *)(int,bool,bool *,int *)'Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast

    Quelqu’un a déjà rencontré ce genre d’erreur? J’ai déjà testé des solutions mais ça ne marche pas^^

    Je vous remercie d’avance !

  2. #2
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour et bienvenu.

    fonction(var1, var2, var4, var3) n'est pas de type MaFonction mais de type bool ; en revanche fonction est du type approprié .

    Plutôt que d'utiliser du gras pour tes exemples de code et d'erreur, utilise plutôt la balise code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main(void)
    {
        return 0;
    }
    ou c pour du std::cout << "code en ligne" << std::endl;.

    Cordialement,
    -- Yankel Scialom

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    fonction(var1, var2, var4, var3); est un appel de fonction et pas du tout un pointeur vers une fonction.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Coucou je vous remercie tous les deux pour votre réponse.
    Si j’ai bien compris il faut que je crée un deuxième pointeur vers ma fonction que j’associe à mon premier pointeur?
    Excellente journée à vous !

  5. #5
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Tu te compliques la vie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objet.MaFonction = fonction;
    Après ça, tu pourras appeler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const bool result = objet.MaFonction(var1, var2, var3, var4);
    -- Yankel Scialom

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    D'un autre côté, tu es en C++: À présent, pourquoi ne pas utiliser std::function<bool(int,bool,bool *,int *)> plutôt qu'un pointeur nu de fonction?
    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.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    Tu te compliques la vie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objet.MaFonction = fonction;
    Après ça, tu pourras appeler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const bool result = objet.MaFonction(var1, var2, var3, var4);
    Coucou merci pour vos réponses!

    Quand j'essaye avec cette méthode j'ai le même type d'erreur au niveau de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    objet.MaFonction = fonction;
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    Da'près ce que j'ai trouvé sur Internet cette façon n'est pas compatible avec un compilateur windows 2008. Reprends moi si je me trompe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     std::function<bool(int,bool,bool *,int *)>
    Merci encore une fois!

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par milianaise Voir le message
    Da'près ce que j'ai trouvé sur Internet cette façon n'est pas compatible avec un compilateur windows 2008. Reprends moi si je me trompe.
    Tu veux dire Microsoft Visual Studio 2008?
    En effet, il faut au moins la version 2010 pour std::function.

    Mais pour le message de prgasp77, normalement ça marche très bien sous 2008, et probablement même sous Visual 6.
    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.

  9. #9
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Bonjour!

    bool (*MaFonction)(int, bool, bool *, int *); est une déclaration de fontion "libre" qui prend 4 paramètres, et qui retourne un bool... Il faut donc lui donner ça.

    Peut-on voir la déclaration de fonction?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tu veux dire Microsoft Visual Studio 2008?
    En effet, il faut au moins la version 2010 pour std::function.

    Mais pour le message de prgasp77, normalement ça marche très bien sous 2008, et probablement même sous Visual 6.
    Oui c'est bien Microsoft Visual Studio 2008

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bool (*MaFonction)(int, bool, bool *, int *); est une déclaration de fontion "libre" qui prend 4 paramètres, et qui retourne un bool... Il faut donc lui donner ça.
     
    Peut-on voir la déclaration de fonction?
    Dans le Objet.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool (*Fct)(int, int, Objet *);// Le pointeur sur une fonction de traitement
    Dans une autre classe Objet2.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    
    bool Objet2::fonction( int num, int repetition, Objet *obj){
    bool etat;
    ....
    return etat;
    
    }
    Dans une fonction de ma classe Objet2.cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    bool Objet2::AutreFonction(...){
    
    Objet objet;
    objet.Fct=fonction;
    const bool result=objet.Fct(var1,var2,var3);
    
    }

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pourquoi cherches-tu à caser dans un pointeur de fonction (libre, qui plus est) une fonction de signature différente, et qui n'est probablement ni statique, ni libre?
    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.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pourquoi cherches-tu à caser dans un pointeur de fonction (libre, qui plus est) une fonction de signature différente, et qui n'est probablement ni statique, ni libre?

    C'est un code qui a été fait en C (qui fonctionne) que je reprends en c++. Surtout que le pointeur de fonction peut pointer vers différentes fonctions selon le contexte.

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Mais il ne peut pointer que vers des fonctions de même signature, c'est le principe du pointeur de fonction.
    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.

  14. #14
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Pour clarification, objet.Fct=fonction; n'est pas accepté par le compilateur --- comme le souligne Médinoc --- car les signatures ne collent pas : objet.Fct est de type bool (*Objet::)(int,int,Objet*) (corrigez moi si je me trompe sur la syntaxe). La différence est majeure, une telle fonction prend en premier argument caché un pointeur vers l'objet. Le nom de ce pointeur ? this .

    Il y a eu une discussion similaire il y a quelques semaines ici-même.
    -- Yankel Scialom

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Tu parles de cette discussion? : lien

    Je vais refaire les choses autrement en tenant compte de vos remarques/conseils/aides (désolée je ne sais pas quel mot employer^^).

    En tout cas je vous remercie d'avoir pris le temps de me répondre!

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par prgasp77 Voir le message
    Pour clarification, objet.Fct=fonction; n'est pas accepté par le compilateur --- comme le souligne Médinoc --- car les signatures ne collent pas : objet.Fct est de type bool (*Objet::)(int,int,Objet*) (corrigez moi si je me trompe sur la syntaxe). La différence est majeure, une telle fonction prend en premier argument caché un pointeur vers l'objet. Le nom de ce pointeur ? this .

    Il y a eu une discussion similaire il y a quelques semaines ici-même.
    Coucou,
    J'ai regardé les différents liens et après des tentatives non fructueuses (et tenant compte de ta remarque sur le pointeur 'this', j'ai essayé avec une fonction non membre de ma classe et cela fonctionne). ça donne ça :

    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
    objet1.h
    bool (*Fct)(int, int, Objet *);// Le pointeur sur une fonction de traitement
    
    
    objet2.cpp
    bool fonction( int num, int repetition, Objet *obj){
    bool etat;
    ....
    return etat;
    
    }
    
    Autre fonction dans la même classe
    bool Objet2::AutreFonction(...){
    
    Objet objet;
    objet.Fct=fonction;
    
    
    }
    Il n'y a donc aucun moyen hormis le système
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::function<bool(int,bool,bool *,int *)> ==> je ne l'ai pas testé donc je n'affirme rien
    d'affecter une fonction membre d'une autre classe à un objet d'une autre classe(car la signature diffère)? (désolée si ma question paraitre futile, j'ai peut-être raté quelque chose dans les explications donc n'hésitez pas à me le faire remarquer.)

  17. #17
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Si il y a moyen, il faut que ta variable qui reçoit le pointeur de fonction attende une fonction membre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef bool (__thiscall Class::*MbrFct)(int, int, Objet *);
    Par contre une grosse limitation est le fait que ça se limite aux fonctions membres de cette classe.

    EDIT:

    Je ne me souviens plus si le __thiscall est vraiment nécessaire.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 12
    Points : 5
    Points
    5
    Par défaut
    Bonsoir , ça fonctionne pas besoin de mettre
    __thiscall
    , je dois juste avoir un problème dans mes includes d'où les messages d'erreurs je dois nettoyer et remettre ça au propre . J'ai encore des questions sur les pointeurs mais avant je vais me documenter et si mes questions restent sans réponse je viendrai m'éclairer de votre savoir! En tout cas merci les gens de m'avoir aidé à régler mon problème!

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/03/2015, 10h57
  2. Réponses: 3
    Dernier message: 03/10/2012, 11h45
  3. Réponses: 20
    Dernier message: 23/01/2007, 15h34
  4. Type mismatch: cannot convert from Integer to int
    Par littleb dans le forum Eclipse Java
    Réponses: 8
    Dernier message: 16/10/2006, 22h35

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