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

Résolu/Fermé
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 - 18 juil. 2012 à 11:07
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 - 20 juil. 2012 à 11:57
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.

4 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
20 juil. 2012 à 08:16
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
20 juil. 2012 à 10:12
Bien vu ou plutôt bien lu ;-))).
Du coup, j'ai plus rien à rajouter.
0
Sauvegarde2 Messages postés 205 Date d'inscription dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 261
20 juil. 2012 à 11:51
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 dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 261
20 juil. 2012 à 11:57
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
19 juil. 2012 à 14:17
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 dimanche 14 décembre 2008 Statut Membre Dernière intervention 11 janvier 2015 261
19 juil. 2012 à 15:18
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
19 juil. 2012 à 21:03
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