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 :

Appel generique de pointeur de fonction qui...


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Par défaut Appel generique de pointeur de fonction qui...
    Bonjour,
    Voila ce que je desire faire mais je n'ai aucune idée de comment ?
    Je possède une liste de pointeur de fonctions.
    Je connais aussi le type de retour des différentes fonctions (genre int, void, char*) et je connais aussi le nombre de parametres de chaque fonctions.

    Le truc que j'aimerai faire c'est pouvoir passer à une fonction generique les diférents elements suivant:
    - pointeur de la fonction a appeler
    - le type de retour de la fonction
    - Une liste des differents parametres

    Voici des exemples de prototypes de fonctions que je dois pouvoir appeler via la fonction generique:
    void func1()
    void func2(int)
    void func3(char *, int)
    int func4(char*, char *, int, char*, float)

    Voila vous l'aurez compris je dois pouvoir appeler toutes sortes de fonctions...

    Si vous avez des idées, reponses ou des questions prevenez moi .!

    Merci!

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour les paramètres, je te conseillerais de passer à ta fonction le nombre de paramètres et une va_list

    (ou mieux, deux versions de la fonction: une avec va_list et une avec ..., la seconde appelant la première comme un simple wrapper)

    Mais le problème majeur, c'est que tu ne pourras pas appeler une fonction sans faire de l'assembleur (ou bien, faire un switch() pour les différents nombres et tailles de paramètres, mais dès qu'il y a des doubles ou des long doubles en jeu, ça perturbe à donf')...
    En fait, tu ne peux pas faire de fonction vraiment générique en C ou en C++ pur... Il te faut soit de l'assembleur, soit une liste finie de types de fonction (comme le fait MFC).



    Pour le type de retour, je te conseillerais une constante, avec un type qui signifie "n'importe quel type pointeur", un/plusieurs pour les entiers (avec variantes de taille et signe) un/plusieurs pour les flottants
    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.

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Par défaut
    Ok pour l'assembleur...
    Je m'imagine mal faire un switch... Donc si le premier type est un char, ... etc etc.

    J'ai trouvé un exemple sur le net justement en assembleur... je vais donc essayer de comprendre sinon rendez vous sur dans la rubrique assembleur.

    En tout cas merci pour tes idées...

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Appel generique de pointeur de fonction qui...
    Citation Envoyé par MonsieurAk
    Bonjour,
    Voila ce que je desire faire mais je n'ai aucune idée de comment ?
    Je possède une liste de pointeur de fonctions.
    Je connais aussi le type de retour des différentes fonctions (genre int, void, char*) et je connais aussi le nombre de parametres de chaque fonctions.

    Le truc que j'aimerai faire c'est pouvoir passer à une fonction generique les diférents elements suivant:
    - pointeur de la fonction a appeler
    - le type de retour de la fonction
    - Une liste des differents parametres
    Tu as vraiment besoin de faire ça ?

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2003
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 222
    Par défaut Re: Appel generique de pointeur de fonction qui...
    Citation Envoyé par Emmanuel Delahaye
    Tu as vraiment besoin de faire ça ?
    Euh... OUI

    (Association de mots d'un langage pour realiser différentes actions)
    Exemple:
    Manger 5 poires Appel de void manger(int nb, char *name)

    Ce n'est bien sur qu'un exemple simple pour la compréhention.
    Mais c'est bien plus complexe...

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Appel generique de pointeur de fonction qui...
    Citation Envoyé par MonsieurAk
    Citation Envoyé par Emmanuel Delahaye
    Tu as vraiment besoin de faire ça ?
    Euh... OUI

    (Association de mots d'un langage pour realiser différentes actions)
    Exemple:
    Manger 5 poires Appel de void manger(int nb, char *name)

    Ce n'est bien sur qu'un exemple simple pour la compréhention.
    Mais c'est bien plus complexe...
    Si c'est ça, il y a deux solutions.

    Les paramètres 'texte' comme pour la ligne de commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int fun_f (int argc, char **argv);
    Ou les 'variadics'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int fun_f (char const *fmt, ...);
    Dans les deux cas, une sérieuse spécification des fonctions et des paramètres s'impose.

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Salut

    A mon avis, c'est à chaque fonction que tu passes à ta fonction générique de savoir quels arguments elle attend, donc je travaillerais avec un type de fonction qui attend toujours le même argument.

    Je définis donc un type de données, c'est plus flexible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef enum {char_val, int_val; unsigned_val, float_val, str_val....} typeval;

    une structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    typedef struct
    {
      type_val type;
      union
      {
          char c_val;
          int i_val;
          unsigned int ui_val;
          float f_val;
          char *str_val;
          .....
      } arg;
    } my_type_arg;
    je passe donc à mes fonctions un pointeur vers un tableau de ces structures (ou éventuellement NULL si la fonction n'attend pas d'arguments)

    Toutes les fonctions auront donc le même prototype :

    my_type_arg fn(my_type_arg *ptr);

    Le seul problème est pour les fonctions qui "retournent" void, on peut ignorer dans ce cas le retour.

    Je n'invente rien, c'est inspiré du type VARIANT.

    Peut-être que le C est incorrect, je n'ai pas testé mais l'idée y est
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Tu as cliqué sur
    Peut-on savoir ce que tu as retenu comme idée et pourquoi ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/08/2009, 16h32
  2. Réponses: 11
    Dernier message: 11/04/2007, 18h33
  3. appel d'une fonction qui est dans une autre page
    Par guppy33 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 02/08/2006, 12h05
  4. Réponses: 17
    Dernier message: 24/03/2005, 12h24
  5. fonction qui retourne un pointeur
    Par sorari dans le forum C++
    Réponses: 6
    Dernier message: 16/03/2005, 21h23

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