Polymorphisme paramétré sur des ABR

Polymorphisme paramétré sur des ABR - C - Programmation

Marsh Posté le 10-01-2009 à 11:50:36    

Salut tout le monde !  
 
Je viens d'implémenter des Arbres Binaires de Recherche (ABR) équilibrés (AVL) en C.  
 
Je veux faire deux arbres, l'un contenant des éléments de type TYPE1 ordonnés par func1, et l'autre contenant des éléments de type TYPE2 ordonnés par func2. Et j'aimerais faire cela en réutilisant un code unique définissant les avl quel que soit le type des éléments.  
 
Je ne sais pas trop comment m'y prendre pour pouvoir faire des arbres de différents types sans recopier tout le code...  
 
Pour le moment dans mon fichier avl.h j'ai un truc du genre :  

Code :
  1. typedef TYPE ElementType;


qui définit le type des noeuds de l'arbre. Et donc dans tout le code des avl je manipule des ElementType. Je peux très bien faire passer le pointeur de la fonction qui permet d'ordonner ces éléments. Ce que je ne sais pas faire, c'est définir plusieurs ElementType différents, en fonction des arbres que j'ai besoin de faire..  
J'ai un peu de mal à exprimer mon problème, mais en gros il s'agit de faire du polymorphisme paramétré sur des arbres.  
 
Pouvez-vous m'éclairer ?  
 
Merci beaucoup !


Message édité par Docteur_Cube le 10-01-2009 à 12:08:32
Reply

Marsh Posté le 10-01-2009 à 11:50:36   

Reply

Marsh Posté le 11-01-2009 à 09:47:33    

Si tu assimiles ElementType à (void *), ça ne marche pas ?  
Après tu passes des fonctions qui recalent le (void *) sur le bon type ça devrait le faire, non ?

Reply

Marsh Posté le 11-01-2009 à 11:34:51    

en général c'ets la seul solution disponbile en C : void* + un identifiant de type. C'est ce que fait MPI par exemple pr ses fonctions de transferts.
 
EN gros tu passes des void* et un identifiant de type : TYPE_INT, TYPE_FLOAT etc et tu switch sur cet identifiant avant d'appeler une fonction proprement typées.
 
En C++, tu ferais juste des templates.

Reply

Marsh Posté le 11-01-2009 à 11:40:18    

Je ne suis pas sûr d'avoir bien compris comment faire exactement, mais je vais essayer quand même. (Mais ça va me prendre du temps parce qu'entre temps j'ai opté pour la méthode crade en recopiant le code...).  
 
Concernant MPI, je suis sensé y venir juste après, car je fais ces arbres pour un algo de sweep-line, et je dois le paralléliser ensuite... Donc ça me rassure que quelqu'un connaisse ici ^^.  
 
Merci pour votre aide !

Reply

Marsh Posté le 11-01-2009 à 11:49:27    

Joel F a écrit :

en général c'ets la seul solution disponbile en C : void* + un identifiant de type.


 
Il y a aussi l'utilisation des macros à la generic.h (voir les vieilles versions de g++ -- 1.X) qui permettent de faire semblant d'avoir des templates.  Attention, le résultat est à peu près impossible à débugger.

Reply

Marsh Posté le 11-01-2009 à 14:30:51    

je dirais même que c'ets compéltement indébuggable [:aloy]
La généricité en C, c'ets pas la joie :/

Reply

Marsh Posté le 11-01-2009 à 15:45:05    

Joel F a écrit :

je dirais même que c'ets compéltement indébuggable [:aloy]
La généricité en C, c'ets pas la joie :/

Pourquoi ? Si tu n'utilises pas de macros, si tu n'utilises que des fonctions callback, ça n'a rien d'extraordinaire.


Message édité par Trap D le 11-01-2009 à 15:46:27
Reply

Marsh Posté le 11-01-2009 à 19:04:07    

je veut dire que c'est quand meme pas fait pour

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed