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 :

interaction entre une fonction statique et l'objet où elle est définie


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 75
    Points
    75
    Par défaut interaction entre une fonction statique et l'objet où elle est définie
    Bonjour à tous,

    je code un programme qui permet de contrôler une carte de génération et d'acquisition de signaux analogiques. une fois lancé l'acquisition est autonome et appelle une fonction callback static pour signaler que l’acquisition est terminée
    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
     
    //aogenrator:h
    class aoGenerator : public QWidget
    {
     
    public :
     
            aoGenerator (QWidget * parent = 0);
            ~aoGenerator();
     
    private :
    int duree;
     
    void updateDisplay();
    static int32 CVICALLBACK DoneCallback (TaskHandle taskHandle, int32 status
                                             , void *callBackData);
    };
    j'aimerais m'en servir pour signifier l’évènement à l'interface seulement celle-ci est définie dans le même objet que DoneCallback. pour cela la variable callBackData me permet de faire passer un pointeur sur l'instance d'aogenerator et ainsi d'accéder au variable de celui-ci mais pas d'exécuter ses fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // aogenerator:cpp
    int32 CVICALLBACK aoGenerator::DoneCallback (TaskHandle taskHandle, int32 status
                                                 , void * callBackData)
    {    
        aoGenerator* gen = (aoGenerator*) callBackData;//  cast de callBackData en aoGenerator
        int d = gen->duree;//marche
        gen->updateDisplay();//marche pas...
     
        return(0);
    }
    bref mon problème est-il du à l'aspect static de la fonction ou bien est-ce autre chose?
    dans les deux cas auriez-vous une idée pour contourner ce problème?

    merci d'avance!!

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Il doit y avoir un problème sur la façon dont la callback est appelée, parce que c'est la technique à utiliser.

    Sauf que, sauf que, sauf que.

    Si jamais QtWidget utilise l'héritage multiple, alors il y a de bonnes et tendres chances pour que, effectivement, le code ne fonctionne pas. Pour contourner le problème, il suffit d'encapsuler ton objet dans un autre - un objet callback :

    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
     
    class callback
    {
    private:
      aoGenerator* gen;
      int32 work(TaskHandle taskHandle, int32 status)
      {
        return gen->DoneCallback(taskHandle, status);
      }
    public:
      callback(aoGenerator *g) : gen(g) { }
      ~callback() { }
      static int32 CVICALLBACK work(TaskHandle taskHandle, 
                                    int32 status, 
                                    void *callBackData)
      {
        callback *c = (callback*)callBackData;
        return c->work(taskHandle, status);
      }
    };
     
    // utilisation
    setup_callback(..., /* pfn */ &callback::work, /* void* param */ new callback(my_gen_obj));
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Si jamais QtWidget utilise l'héritage multiple
    C'est QWidget (sans t )
    Et effectivement, QWidget utilise le double héritage (QObject et QPaintDevice)

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 75
    Points
    75
    Par défaut
    Merci pour vos réponses

    bon je ne saisi pas du tout le lien avec l'héritage multiple...mais je vous confiance du coup j'essaie d'implémenter l'encapsulage...ce qui peut prendre du temps. je reposte dès que j'ai du nouveau.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 75
    Points
    75
    Par défaut
    C'est bon tout marche!!
    merci à vous

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Zhitoune Voir le message
    Merci pour vos réponses

    bon je ne saisi pas du tout le lien avec l'héritage multiple...mais je vous confiance du coup j'essaie d'implémenter l'encapsulage...ce qui peut prendre du temps. je reposte dès que j'ai du nouveau.
    Déjà, on note que objet* -> void* -> objet* est une transformation dont le comportement est noté comme étant indéfini dans la norme. Il y a un risque non négligeable à faire cette transformation, car elle dépends fortement de l'implémentation sous jacente.

    Dans le cas de l'héritage non multiple, la transformation objet* -> void* -> objet* est plus ou moins sans risque, car objet* est un pointeur vers la vtable de l'objet dans la plupart des implémentation que je connais (plus exactement, this == pointeur sur la vtable)

    Dans le cas de l'héritage multiple, objet possède plusieurs vtable. Le mécanisme de fonctionnement est différent, et les cast peuvent poser des problèmes (la cohérence entre this et les vtable n'est plus maintenue correctement). Du coup, dans la grande majorité des cas, ça plante de manière incompréhensible.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  7. #7
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Déjà, on note que objet* -> void* -> objet* est une transformation dont le comportement est noté comme étant indéfini dans la norme.
    Citation Envoyé par n3242 5.2.9 $13
    Une valeur de type pointeur sur objet convertie en pointeur sur void et reconvertie dans l'autre sens, avec un cv-qualification potentiellement différente, doit avoir sa valeur original.
    (traduction libre)

  8. #8
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Mmm. Idem en 5.2.9 §10 dans le texte de la norme de 98.

    Je vais revoir mes classiques.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

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

Discussions similaires

  1. Interaction entre une JSP et une fonction Javascript
    Par phenix1988 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 28/12/2011, 09h25
  2. Parametre d'entrée : une fonction!
    Par Enayem dans le forum C++
    Réponses: 15
    Dernier message: 04/06/2007, 13h44
  3. Passage de paramètres entre une fonction et une interface graphique
    Par ninja_3 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 29/05/2007, 11h37
  4. Réponses: 1
    Dernier message: 25/05/2007, 14h33
  5. Conflit entre une fonction Delphi et une API ?
    Par [ZiP] dans le forum Delphi
    Réponses: 2
    Dernier message: 23/01/2007, 10h14

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