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 :

Pointeur de fonction en paramètre d'un constructeur


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Pointeur de fonction en paramètre d'un constructeur
    Bonjour tout le monde.

    Je dois convertir un progrmme du C en C++, à cause des pilotes utilisés précédament en C, et seulement disponible en C++ dans la dernière version.
    J'ai déjà eliminé pas mal de petits particularités, mais il y en a quelques uns qui me bloquent.

    J'ai une structure qui est initialisé à sa déclaration :
    <<
    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
    const struct driver_t beirlistener_driver = {
            .name = "beirlistener_driver",
            .cfg_ctl = {
                    .cfg_new = &beirlistener_cfg_new,
                    .cfg_parse = &beirlistener_cfg_parse,
                    .cfg_del = &beirlistener_cfg_del,
                    .cfg_parse_ended = &beirlistener_cfg_parse_end
            },
            .ctx_ctl = {
                    .ctx_new = &beirlistener_ctx_new,
                    .ctx_del = &beirlistener_ctx_del
            },
            .thread_ctl = {
                    .run = &beirlistener_run,
                    .queue_clean = NULL,
                    .stop = &thread_request_stop_intr
            }
    };
    >>
    cfg_ctl, ctx_ctl and thread_ctl sont des structures qui contiennent des pointeurs vers des fonctions.
    Ces structures contiennent des pointeurs vers des fonctions qui seront utilisés pour initialiser, exécuter et supprimer un thread. Il est utilisé pour différents threads dans différents fichiers, et est initialisé avec les fonctions nécessaires. L'exemple affiché en est un parmi d'autres.

    Mais ce n'est pas quelque chose qui peux se faire en C++, seulement en C.
    La solution que je souhaite mettre en application est de déclarer un constructeur pour la structure, qui reçois les adresses des fonctions, et initialise les variables de la structure. Ainsi, la déclaration de la structure se ferai ainsi :
    <<
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const struct driver_t beirlistener_driver = {"beirlistener_driver",
    &beirlistener_cfg_new, &beirlistener_cfg_parse, ...};
    >>
    J'ai essayé de déclarer la structure de la manière suivante ... :
    <<
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct driver_t {
            char                    *       name;
            struct config_ctl_t             cfg_ctl;
            struct context_ctl_t            ctx_ctl;
            struct thread_ctl_t             thread_ctl;
     
            driver_t(char * cname, int (*fcn)(void **)) {
                    name = cname;
                    cfg_ctl.cfg_new = fcn;
            }
    };
    >>
    ... pour fonctionner avec la déclaration, mais ça ne fonctionne pas. Il ne semble pas reconnaitre comme paramètre un pointeur de fonction dans le constructeur et donne le message d'erreur suivant (avec g++) :
    <<
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /home/anton/Projects/splusserver3/src/beirlistener.c:90: error: scalar
    object ‘beirlistener_driver’ requires one element in initializer
    >>

    J'ai fait des recherches pour trouver une solution, mais je n'en ai pas encore trouvé. Si quelqu'un a des lumières pour m'éclairer et trouver une solution à ce problème, cette personne aurai toute ma gratitude.
    Merci d'avance.

    Mad Ant

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    1/ balises code, car la c'est illisible.

    2/ le compilo ne te donne pas qu'une erreur mais aussi une ligne dans le programme. Ou est appelé le constructeur ?

    Ceci dit, je penses que le problème vient du fait que C++ est plus strict que C sur les concertions de pointeurs. ypiquement le void** m'inquiete.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Cette syntaxe avec ".truc = machin" n'est assurément pas du C++, et je ne pense pas qu'elle soit du C non plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    const struct driver_t beirlistener_driver = {"beirlistener_driver",
    &beirlistener_cfg_new, &beirlistener_cfg_parse, ...};
    Pour créer une variable en passant des paramètres au constructeur, une écriture est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const driver_t beirlistener_driver ("beirlistener_driver", &beirlistener_cfg_new, &beirlistener_cfg_parse, ...);
    Après, il faut effectivement que les types de pointeurs de fonction correspondent bien.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Hum, cette première structure est très étrange. c'est pas du C++ a moins qu'il y a les des #defines qui vont bien, et a ce moment la, il serait bien de les connaître.

    g++ -E devrait pouvoir te sortir le code généré après passage du préprocesseur.

Discussions similaires

  1. pointeur de fonction en paramètre d'une fonction
    Par virtual_bug dans le forum C++
    Réponses: 4
    Dernier message: 06/01/2015, 22h36
  2. Pointeurs de fonction membre à paramètres variables!
    Par nixmind dans le forum Langage
    Réponses: 11
    Dernier message: 29/09/2012, 03h12
  3. Pointeur de fonction en paramètre
    Par Dani3L dans le forum GLUT
    Réponses: 7
    Dernier message: 05/07/2008, 16h20
  4. Réponses: 8
    Dernier message: 05/07/2007, 13h44
  5. Réponses: 4
    Dernier message: 01/12/2005, 12h33

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