
Après ça se fait très bien en assembleur [inline] mais c'est pas portable... Et ça tombe très bien car les conventions d'appel ne sont pas portables :]
Zephyr (./175) :
d'ailleurs pour confirmation, il n'existe pas de façon portable de réaliser un appel de fonction avec un nombre quelconque de paramètres de types quelconques non connus en temps de compilation ?
Kevin Kofler (./181) :
void (*)()
GoldenCrystal (./185) :
Heu empiler les paramètres sur la pile (par ordre inverse - puis les dépiler une fois l'appel effectué) c'est bien la convention d'appel du langage C non ?
#include "unedit.h" #include "kernel.h" #include "genlib.h" #include "funcs.h" #include "vars.h" unsigned short MapWidth = 0; unsigned short MapHeight = 0; const SCR_RECT Clip = {{0,0,239,127}}; void main(void) { NewMap(); }
#include "unedit.h" #include "kernel.h" #include "genlib.h" #include "funcs.h" #include "vars.h" void DrawBox(char* title) { ScrRectFill (&Clip, &Clip, A_REVERSE); ScrRectFill (&(SCR_RECT){{0,0,239,15}}, &(SCR_RECT)Clip, A_NORMAL); DrawStr (3, 3, title, A_REVERSE); DrawClipRect (&(WIN_RECT){0,0,159,99}, &(SCR_RECT)Clip, B_DOUBLE); ngetchx(); } void NewMap (void) { DrawBox ("New Map"); }
Kevin Kofler (./181) :
Tu peux abuser de la compatibilité K&R et déclarer tes fonctions comme void (*)()
Zephyr (./175) :ah j'avais oublié que tu voulais être *totalement* générique.
(sachant que prévoir les 1092 prototypes possibles pour des fonctions de 1 à 6 arguments char/short/long n'est pas super élégant comme solution)
typedef void (*double_pointeur_de_la_mort)(void *, void *); #define ROX(n) struct je_code_comme_un_gros_porc_mais_je_m_en_fous ## n { int je_sais_pas_trop_quoi[n]; }; /* #trioui# */ \ void apeller_la_fonction_ ## n(void (*la_fonction)(), struct je_code_comme_un_gros_porc_mais_je_m_en_fous ## n *les_parametres) { la_fonction(&les_parametres); }; /* kikoo ! lol ! */ #define RIX(n) (double_pointeur_de_la_mort)apeller_la_fonction_ ## n #define NOMBRE_DE_ROXXOR/*_PRESENTS_DANS_LA_SALLE 0 * */10000 ROX(0) ROX(1) // Et ainsi de suite [...] ROX(NOMBRE_DE_ROXXOR) double_pointeur_de_la_mort apeller_la_fonction_en_vrai[NOMBRE_DE_ROXXOR] = { RIX(0), RIX(1), // Et la série continue... RIX(NOMBRE_DE_ROXXOR) } int *gros_bouffeur/* de mémoire */[1000]; void apeller_la_fonction(void (*la_fonction)(), void *les_para_metres, int c_la_taille_qui_compte) { apeller_la_fonction_en_vrai[c_la_taille_qui_compte](la_fonction, les_para_metres); }
GoldenCrystal (./199) :
La fonction que t'appelles en C, de base si tu as son pointeur, c'est que tu l'as récupérée quelque part, donc que tu connais son prototype, donc que tu peux l'appeler directement... Ou j'ai manqué un truc ?
GoldenCrystal (./200) :
Le seul cas où ça pourrait se poser c'est si tu voulais... par exemple... demander à l'utilisateur d'entrer le nom d'une fonction [que tu connais pas] puis l'appeler avec des paramètres [que tu connais pas encore]...
GoldenCrystal (./200) :
A moins que pour java tu aies autre chose que l'infame JNI ?