![Citation](https://forum.developpez.be/images/misc/quote_icon.png)
Envoyé par
Bktero
Pourquoi codes-tu en C ?
Je code en C++ en fait mais j'ai besoin d'avoir une API C ![:aie:](https://www.developpez.net/forums/images/smilies/aie.gif)
J'ai trouvé une méthode légèrement plus simple et j'ai alors utilisé un define un peu verbeux :
SIGNAL( signal, (bool a, int b), (a,b) )
Plus tard, je pourrais ajouter un mot clé que je remplacerait par ma macro.
Pour revenir à ton problème, je pense que tu auras le même genre de problème qu'avec la discussion précédente : la généricité. Si toutes tes fonctions avaient le même prototype, il me semble voir un embryon d'idée. Mais avec des prototypes différents, je sèche un peu… Peut-être en rajoutant un paramètre "type" pour indiquer le prototype souhaité et faire un switch / case dans makeLambda(). Il y a par contre le risque d'avoir des warnings de type insolubles, sauf à caster implicitement mais il n'y a plus alors de vérification de types par le compilateur.
J'ai trouvé un début de réponse.
Déjà, si les arguments ont la même taille, le type importe peu :
1 2 3 4 5
| void foo(char a);
void (*ptrFoo)(uint8_t a) = (void (*) (uint8_t) )foo;
ptrFoo( 'a' ); // marche |
Donc il faut stocker la taille de chaque argument mais pas leurs type.
Après, le seul problème c'est qu'il faut stocker les arguments.
A l'aide d'une fonction de serialisation, c'est tout à fait possible :
char * serialise(size_t * taille_des_arguments, ...);
Le seul problème, c'est pour deserialiser les arguments et les passer à la fonction.
Il me faut une fonction de deserialisation par "paramètres possibles" :
1 2
| deserialise_8_32_64(args, slot); // appelle slot avec les arguments qui ont 8bits, 32 bits et 64 bits.
deserialise_16_8_128(args, slot2); // appelle slot2 avec les arguments qui ont 16 bits, 8 bits et 128 bits. |
Je vais donc devoir rajouter à ma macro SIGNAL quelques paramètres :
SIGNAL( signal, (bool a, int b), (a,b), deserialise_8_32, {sizeof(bool), sizeof(int) } )
J'aimerais bien virer le 4 ème argument et trouver la bonne fonction en fonction du 5ème argument...
Peut-être qu'en remplaçant toutes les fonctions deserialise par une unique fonction... mais il faudrait que je regarde comment je pourrais faire ![:aie:](https://www.developpez.net/forums/images/smilies/aie.gif)
Après, je ferais :
signal signal(bool, int);
Et quand j'exécuterais un petit programme de ma composition, il m'écrira :
SIGNAL(signal, (bool a, int b), (a,b), ????, {sizeof(bool), sizeof(int})
Donc j'ai presque fini \o/
EDIT : Le préprocesseur C est tout de même plus que décevant, on a même pas un équivalant à sizeof() pour le préprocesseur ![:cry:](https://www.developpez.net/forums/images/smilies/icon_cry.gif)
Peut-être que je vais donner quelques limitations du style : 4 arguments max et 4 tailles possibles
Partager