[C] Fonction générique, pointeur de fonction

Résolu
Sauvegarde2 Messages postés 205 Date d'inscription   Statut Membre Dernière intervention   -  
Sauvegarde2 Messages postés 205 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Est-il possible de créer une fonction en C qui fait ça (sans faire hurler le compilateur) :

void* fexec_3(void* arg[4])
{
return (*arg[0])(*arg[1], *arg[2], *arg[3]);
}

C'est à dire une fonction générique qui prend en argument un tableau constitué d'un pointeur de fonction à 3 arguments de type quelconque suivi des 3 arguments en question ; puis exécute la fonction et renvoi le résultat.

Le tout sans cast (généricité oblige) ; ou alors en faisant un cast générique de la fonction *arg[0].

Une telle fonction serait intéressante pour utiliser pthread.
A voir également:

4 réponses

Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
je crois que tu ne répond pas vraiment à la question fiddy. son problème c'est de passé un tableau de pointeur dont le premier pointeur est un pointeur de fonction.

je ne vois pas de raison que ça ne fonctionne pas. essai peut être juste de faire un typedef :
typedef void* (*fonct)(void*,void*,void*);/: deéclaration non garantit, mais ça y ressemble.

Puis dans fexec_3 tu fait un truc du genre :
fonct f=argv[0];
return f(argv[1],argv[2],argv[3]);
en gros l'idée, peut être quelques erreur de '*' ou pas '*'. Mais ça devrait être bon.
1
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bien vu ou plutôt bien lu ;-))).
Du coup, j'ai plus rien à rajouter.
0
Sauvegarde2 Messages postés 205 Date d'inscription   Statut Membre Dernière intervention   261
 
Effectivement ça fonctionne comme ça, merci beaucoup :-)

typedef void* (*fct)(void*, void*, void*);

void* fexec_3(void* arg[4])
{
    fct f = arg[0];
    return (*f)(arg[1], arg[2], arg[3]);
}
0
Sauvegarde2 Messages postés 205 Date d'inscription   Statut Membre Dernière intervention   261
 
A noter que l'on peut aussi caster directement sans typedef :

void* fexec_3(void* arg[4])
{
    return ((void*(*)(void*, void*, void*))arg[0])(arg[1], arg[2], arg[3]);
}
0
Utilisateur anonyme
 
Je ne sais pas, essaie, mais en tout cas, ca fera moins cracher le compilateur comme ca :

void* fexec_3(void* arg[4])
{
return (*arg[0](*arg[1], *arg[2], *arg[3]));
}

Aussi, je crois que tu ne peux renvoyer que des fonctions qui renvoie elle meme une valeure. Hors, les fonctions de multi_threading, et l'execution d'un thread en particulier, ne renvoie rien (de memoire). Ca poserai probleme !
0
Sauvegarde2 Messages postés 205 Date d'inscription   Statut Membre Dernière intervention   261
 
Ca ne va pas non plus puisqu'on déréférence quand même un void* sans faire de cast.

Le problème c'est que si je cast le pointeur de fonction contenu dans arg[0] je perd la généricité.

Je crois que mon problème n'a pas de solution :(
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bonjour,

Effectivement, le compilateur risque de râler avec ça ^^.
Moi, je verrais plutôt :
void* fexec_3(void* arg[4]) 
{ 
    int i;
    void **t[4];
    for(i=0;i<4;i++)
       t[i]=arg[i];
    return *t;

} 

0