
Bon, voilà le contexte, maintenant, voici mon problème : ma lib se décompose grossièrement en 2 fonctions de bas niveau qui se déclinent chacune en une variété de modes différents, ce qui fait qu'en tout, il y a 80 combinaisons différentes pour utiliser la lib. Et en ce qui concerne les fonctions de haut niveau, j'aimerais qu'elles soient simples à utiliser, et qu'on n'ait pas trop de choix de fonctions différentes, pour ne pas embrouiller l'utilisateur.
Donc, comme je l'ai dit précédemment, les fonctions de haut niveau appellent les fonctions de bas niveau, et la multitude des fonctions de bas niveau fait qu'il y a beaucoup de possibilités d'utilisation.
Il faut donc qu'à partir des paramètres passés à la fonction de haut niveau je puisse déterminer quel couple sous-fonctions de bas niveau je dois appeler pour correspondre à l'utilisation demandée.
*call_back2)(void*,short,short,void*));J'ai donc pensé à un truc comme ceci : void HautNiv(void (*call_back1)(short,void*,void*,void*),void (Où la première fonction de bas niveau a un prototype du genre void nom(short,void*,void*,void*); et la deuxième void nom(void*,short,short,void*); (enfin, on verra toute à l'heure que ce n'est pas toujours le cas).
Cela permet à l'utilisateur de la fonction de haut niveau de choisir lui-même ce qu'il veut comme combinaison des deux fonctions de bas niveau.
voir utiliser les fonctions de haut niveau. Pour pallier à ce problème, je déclare des macros avec des noms explicites du genre :void BasNiv1A(short,void*,void*,void*); void BasNiv3C(void*,short,short,void*); #define Type_1_A Fonction1A #define Mode_3_C Fonction3C HautNiv(Type_1_A,Mode_3_C); // L'appel de la fonctionBien sûr, vous allez me dire que ça n'est pas du tout pratique à utiliser parce que l'utilisateur des fonctions de haut niveau sera obligé de connaître toutes les fonctions de bas niveau pour pouCe qui devrait être relativement facile à utiliser.
Mais en fait, il y a un léger problème, c'est le fait les fonctions de bas niveau n'ont pas toutes le même prototype. Je peux faire un transtypage pour éviter un warning à la compilation ; et pour les paramètres (lors de l'appel de la sous-fonction à partir de la fonction de haut niveau), ce n'est pas pratique du tout, ça m'oblige à passer le maximum de paramètre possible alors que certaines fonctions n'en ont pas besoin.
Exemple illustratif :
Supposons que la fonction correspondant au mode 2B prenne 3 paramètres et la fonction correspondant au mode 2C en prenne 4. J'utilise une fonction de haut niveau, et à l'intérieur de cette fonction, la fonction correspondant au mode choisi (2B ou 2C dans notre cas) est appelée car je passe son adresse à la fonction de haut niveau. Mais la fonction de haut niveau n'a aucun moyen de savoir s'il s'agit de la sous-fonction qui correspond au mode 2B (3 paramètres), ou 2C (4 paramètres), donc pour pouvoir assurer un bon fonctionnement, la fonction de haut niveau doit passer 4 paramètres, pour être sûre qu'au cas où la fonction demandée est la 2C il n'y ait aucun problème.
Seulement c'est dommage de passer à chaque fois ce paramètre alors qu'il n'est pas indispensable.
Donc déjà, est-ce que vous avez une solution plus simple pour gérer tous les modes ?
Sinon, avez-vous des idées pour contourner mon problème ?
Merci
