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 :

Classes chargées dynamiquement. Questions diverses


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 35
    Points : 31
    Points
    31
    Par défaut Classes chargées dynamiquement. Questions diverses
    Bonjour à tous,
    Je suis en train de m'atteler aux chargements dynamiques de classes en C++ sous Linux. Je me base sur le document Exportation de classes C++ dans une bibliothèque dynamique sous Linux de hiko-seijuro (que je remercie au passage).
    Je n'ai trop pas de soucis pour comprendre le principe des exemples utilisés, mais quelques interrogations demeurent. Je me base sur le code source de la deuxième partie du document "III - Création, exportation et utilisation des classes C++".

    ------------------------------
    *Une des premières lignes de code utilisée est :
    Je ne comprend pas vraiment de quoi il s'agit. Serait-ce une déclaration de fonction attendant d'être défini plus tard?
    Un peu plus loin, hndl est utilisée de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hndl = dlopen("./libcircle.so", RTLD_LAZY);
    Mais le constructeur de dlopen ne semble pas correspondre avec cette ligne (à mon sens, du moins, d'où mon inconpréhension).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void *dlopen (const char *filename, int flag);
    Au final, dlopen(... ...) ne devrait rien retourner. Comment donc affecter le retour de cette fonction au pointeur hndl?

    ------------------------------
    *Je ne comprend pas du tout la syntaxe de ce typedef :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef circle *(*maker_circle)();
    Je n'arrive pas du tout à comprendre ce que ça signifie, et son implantation de le code final ne parviends pas à m'aider.
    De la même manière, je ne comprend pas du tout son utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    maker_circle pMaker;
    //un peu plus loin
     void *mkr = dlsym(hndl, "make_circle");
    //Puis encore plus loin
    pMaker = (maker_circle)mkr;
    Je ne comprend pas du tout la syntaxe, une fois de plus. Je suis incapable de saisir le sens des ces quelques lignes.

    A ce propos, toujours à propos du typedef. Je cite la page 7.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef CIRCLE_H_
    #define CIRCLE_H_
    #include <iostream>
    class circle
    {
    public:
    virtual void draw();
    };
     
    typedef circle *(*maker_circle)();
    #endif
    [...] Les 2 typedefs permettent d'alléger la syntaxe du programme principal que l'on verra dans le point suivant.
    Pourtant, je ne vois qu'un seul typedef. A moins que je n'ai pas interpreté correctement le code.

    ------------------------------
    Pourriez-vous m'éclairer un peu là dessus?
    Merci et bon début de semaine.

  2. #2
    Membre habitué Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Points : 150
    Points
    150
    Par défaut
    Bonjour,

    void* est très différent de void tout court.
    void signifie « rien » et aucune variable de ce type ne peut être créée.
    void* est un pointeur pointant sur un objet de type indéterminé (il peut pointer sur n’importe quelle variable).

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void* hndl; // pointeur sur n’importe quoi
    void (*hndl)(); // pointeur sur une fonction ne renvoyant
                    // rien et ne prenant aucun argument
     
    void* dlopen(...); // fonction renvoyant un pointeur de type void*
    void dlopen(...);  // fonction ne renvoyant rien

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef circle* (*maker_circle)();
    Ça fait de maker_circle le nom d’un type de fonction renvoyant un circle* et ne prenant pas d’arguments (oui, la syntaxe est un peu particulière).

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    make_circle pMaker;
    déclare un pointeur de fonction (voir typedef précédent).

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void* mkr = dlsym(hndl, "make_circle");
    pMaker = (maker_circle)mkr;
    récupère un pointeur indéterminé avec dlsym, et le convertit en maker_circle pour le stocker dans pMaker.

Discussions similaires

  1. [XL-2007] questions diverses tableau croisés dynamique
    Par number8326200 dans le forum Excel
    Réponses: 6
    Dernier message: 10/10/2011, 11h07
  2. [FLASH] Imprimer une image chargée dynamiquement
    Par penchu dans le forum Flash
    Réponses: 2
    Dernier message: 04/01/2006, 16h59
  3. Petites questions diverses
    Par Fouflarage dans le forum Débuter
    Réponses: 7
    Dernier message: 29/11/2005, 13h43
  4. Questions diverses sur TIBDataset et TDBGrid
    Par AlexB59 dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/11/2005, 17h14
  5. Trouver le Type d'une classe template dynamiquement ?
    Par Serge Iovleff dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 16h48

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