Zeph Le 22/01/2005 à 21:07 Je dois appeller une fonction avec des paramètres, et récuperer son éventuelle valeur de retour.
Supposons que je n'ai à ma disposition qu'un pointeur vers la fonction, et une chaine qui symbolise son type. Pour simplifier, on supposera qu'une fonction ne peut accepter (autant pour sa valeur de retour que pour les paramètres) que 4 types : "void", "unsigned char *", "signed long", et "double", respectivement codés "0", "1", "2" et "3".
Une fonction de cette forme : void print_xy(unsigned char *str, signed long x, signed long y);
Aura donc cette chaine associée : "0122" (0 pour le void, puis le type des paramètres à la suite, donc 112")
On retourne donc au problème, je n'ai que ces deux informations (pointeur et chaine) à ma disposition, et je voudrais appeller la fonction ("str", "x" et "y" sont bien sûr définis). En gros, je suppose qu'il faut passer les arguments "à la main", puisqu'on ne connait pas le prototype de la fonction à la compilation, puis appeller effectivement la fonction, et récuperer sa valeur de retour si il y en a une. C'est possible ?

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
Vark Le 22/01/2005 à 23:51 C'est peut-etre une feature propre a gcc (sux) mais pour un projet qui correspondait un peu a ce que tu demande j'avais un pointeur de type :
typedef void *(*t_genfuncvs)();
qui me permettait de pointer sur les fonctions de tout type, en passant tous les arguments que je voulais (enfin 4 max pour etre sur que ca fasse pas de merde)
*** Ne sous-estimez pas la puissance de la Marmotte ***
©
Marmotte Team : LaMarmotte, sBibi, Vark & sabrina
Zeph Le 23/01/2005 à 00:00 heu, oui mais là les arguments sont dans une liste (en gros), donc je peux pas appeller une fonction directement (si c'est bien comme ça que ça doit marcher ?)
en gros, fonc(arg[0],arg[1],arg[2]), impossible, je sais pas cb y'a d'args :/

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
Je remets ici : libffi (foreign function interface) permet de construire dynamiquement des appels de fonction.
Je n'ai pas trouvé de documentation allant avec, mais le fichier d'en-tête est très simple, ça peut s'utiliser au rtfh.
normalement y'en a juste un à #includer
Si j'ai le temps je testerai ça.
PpHd Le 04/02/2005 à 15:34 Utilise une knoppix et basta !
PpHd Le 04/02/2005 à 17:37 Va te plaindre a microsoft ou installe cygwin/mingwin.
Zeph Le 07/02/2005 à 10:39 J'en sais rien, mais mettre un .h pour permettre aux gens sous win de l'utiliser, c'est si difficile que ça ?

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
Zeph Le 07/02/2005 à 10:50 Oui, v être obligé de faire ça... Ou de trouver une autre lib, d'ici deux semaines faudra bien que je tranche pour une ou l'autre de ces solutions :/

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
PpHd> bah t'as plus que ça à faire, t'as aussi les Makefile.am à transformer en Makefile.in puis Makefile
Zeph Le 07/02/2005 à 21:54 si mais ça fait chier, j'ai tous les outils qu'il me faut sous win, j'ai moyennement envie de passer sous osx juste parceque qqun a pas prévu le nécessaire... :/
en fait j'ai posté le topic à la place de qqun d'autre, c'est pas à moi de m'occuper de ça, mais par principe je trouve ça dommage de pas avoir fait le peu d'effort nécessaire pour que ça puisse être utilisable par tout le monde.

All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez
par ici :)
mais honnêtement y a pas moyen de faire sans ça ? parce que c'est crade, platform-dependent et tout et tout... (et source d'emmerdes, la preuve ^^)
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
non enfin parce que je soupçonne que :
- d'une part, on ne peut construire les arguments que pour la partie vararg de la fonction (donc si t'as une fonction qui prend exactement 4 arguments, ben tu vas pas pouvoir l'appeler comme ça, parce que le compilo aura pu mettre des args dans des registres et y a aucun moyen de le savoir dynamiquement, ou alors ça devient hyper-compliqué [infos de débug, toussa])
- d'autre part, si c'est pour la partie vararg d'une fonction, ben si c'est toi qui l'as écrite, tu peux la réécrire sans problème pour qu'elle utilise un tableau (c'est plus propre, totalement portable, etc...)
Donc je vois une utilité que si tu utilises une lib closed-source, écrite suffisamment mal pour qu'il y ait une fonction vararg qui n'ait pas d'alternative sans vararg, et dont tu ne peux vraiment pas te passer. Dans tous les autres cas, j'aurais tendance à penser que c'est une erreur de faire comme ça...
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)