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++/CLI Discussion :

Probléme de pointeur sur fonction


Sujet :

C++/CLI

  1. #1
    Membre habitué Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Points : 177
    Points
    177
    Par défaut Probléme de pointeur sur fonction
    bonjour,

    Je tentes de passer un pointeur sur fonction en paramétre d'une fonction déclaré ainsi:

    Fonction recevant en le pointeur sur fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    namespace FLMotis {
      namespace DB{
        bool DB_Create(string path,void (*addMessage)(string& str));
      }
    }
    Et la fonction pointée ainsi que l'appel de la fonction DB_Create :
    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
     
    namespace FLMotis{
      public ref class Form1: public System::Windows::Forms::Form {
         [...]
     
         public: void addMessage(std::string& str) {....}
     
         private: System::Void button1_Click(System::Object^ sender,System::EventArgs^ e) {
              [...]
              FLMotis::DB::DB_Create(str, this->addMessage);
              [...]
         }
     
      }
    }
    Et VC++ me retourne l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    c:\documents and settings\florent\mes documents\visual studio 2005\projects\flmotis\flmotis\Form1.h(227) : error C3867: 
    &'FLMotis::Form1::addMessage' : liste d'arguments manquante dans l'appel de
     fonction ; utilisez 'FLMotis::Form1::addMessage' pour créer un pointeur vers
     membre
    Là, vraiment, je comprends pas.

    Merci pour votre aide les ptit ;
    TSalm

  2. #2
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Salut,

    il faut que tu passes par un delegate je crois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    delegate AddMessageDelegate(std::string& str);
     
    AddMessageDelegate ^ myDelegate = gcnew AddMessageDelegate(this, &Form1::addMessage);
     
    typedef void PtrAddMessage(std::string& str);
     
    PtrAddMessage * ptrAddMessage = (PtrAddMessage *)(System::Runtime::InteropServices::Marshal::GetFunctionPointerForDelegate(this->myDelegate ).ToPointer());
     
    FLMotis::DB::DB_Create(str, ptrAddMessage );
    Un truc du style. A tester.

    Flo.

  3. #3
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    c'est dommage d'utiliser des pointeurs de fonctions

    regarde aux délégates , dans la faq http://dotnet.developpez.com/faq/cpp...whatisdelegate

  4. #4
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Oui, c'est dommage ...

    J'ai été confronté au même problème la semaine dernière en voulant m'interfacer avec un périphérique matériel dans un projet en managé. Le problème était que les callback se faisaient via des pointeurs de fonctions. J'ai du faire le passage delegate / pointeur de fonction.

    C'est peut-être la situation de TSalm.

    L'idéal serait d'encapsuler la gestion du périphérique matériel (et de sa callback) dans une dll mixant managé et non managé et de proposer à l'utilisateur de la dll un delegate pour une gestion en managé uniquement.

    Mais dans la dll le passage en managé / non managé nécessite tout de même de faire une conversion delegate et pointeur de fonctions.

    Si ça peut aider TSalm ... je compatis

    Flo.

  5. #5
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    il ne semble pas faire d'interop, je me trompe peut-etre, dans ce cas, faut rester CLS-Compliant

  6. #6
    Membre habitué Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Points : 177
    Points
    177
    Par défaut
    merci pour vos réponse.
    Et merci à Flo pour son code, maintenant, je n'ai plus de probléme à la compilation...

    Juste AccessViolationException que j'espére résoudre très vite (au pire, je soumettrai mon probléme au forum).

    En ce qui concerne l'utilisation des pointeur de fonction, je dois utiliser un code indépendant de Visual C++. Elle doit être uniquement présente sur la partie interface graphique.

    @+

  7. #7
    Membre habitué Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Points : 177
    Points
    177
    Par défaut
    Bonjour,

    Mon probléme n'est hélas pas vraiment résolu.
    La compilation se passe sans problémes aucun. C'est à l'execution, au moment de l'appel de ma fonction pointée que, dans une boite de dialogue, le message apparait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Une exception non gérée du type 'System.AccessViolationException' s'est produite dans FLMotis.exe
     
    Informations supplémentaires*: Tentative de lecture ou d'écriture de mémoire protégée. Cela indique souvent qu'une autre mémoire est endommagée.

    La fonction qui appelle ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    bool FLMotis::DB::DB_Create(string path ,void (*addMessage)(string str)) {
    	// ...
             // le provocateur délictueux du message sus-mentionné :
    	(*addMessage)(string("Try to create the table Information:"));
    	// ...
    	return true;
     
    }

    Pour l'appel de cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    FLMotis::DB::DB_Create( str, ptrAddMessage);

    Quoi rajouter sinon :"AU SECOURS !!"
    D'avance merci pour votre aide
    TSalm

  8. #8
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    le but est d'appeler une méthode depuis une autre en la passant comme paramètre de fonction ?

  9. #9
    Membre habitué Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Points : 177
    Points
    177
    Par défaut
    Citation Envoyé par nico-pyright(c)
    le but est d'appeler une méthode depuis une autre en la passant comme paramètre de fonction ?
    Exactement.
    S'ajoute à ça que la fonction qui prends en paramétre le pointeur sur fonction pour l'appeler(la fonction pointée) doit rester dans un C++ GCC compatible (n'y voyez là aucun troll )

  10. #10
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    tu veux dire par là que c'est une fonction native ?

  11. #11
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Points : 16 075
    Points
    16 075
    Par défaut
    tu peux regarder cet exemple sur mon blog http://blog.developpez.com/index.php...&pb=1#more3692

  12. #12
    Membre habitué Avatar de TSalm
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 361
    Points : 177
    Points
    177
    Par défaut
    Merci

Discussions similaires

  1. Problème pointeur sur fonction static
    Par Julien_C++ dans le forum C++/CLI
    Réponses: 5
    Dernier message: 11/01/2008, 19h26
  2. Problème de pointeur sur une fonction
    Par CodeurNé dans le forum C
    Réponses: 4
    Dernier message: 03/10/2007, 22h45
  3. pointeurs sur fonction en C++
    Par cemoi dans le forum C++
    Réponses: 7
    Dernier message: 29/11/2004, 13h19
  4. [langage] Pointeur sur fonction
    Par Fanch.g dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2004, 10h43
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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