Accueil > > > [C] COMPARAISON GÉNÉRIQUE (OU COMMENT COMPARER DES ELEMENTS DU TYPE VOID * ...)
[C] COMPARAISON GÉNÉRIQUE (OU COMMENT COMPARER DES ELEMENTS DU TYPE VOID * ...)
Information sur la source
Description
Bon, je sais que c'est pas très clair, mais c'est un peu compliqué à expliquer seulement à l'aide du titre.
Alors voilà mon problème. J'avais codé une liste en C dont les élements à l'interieur était du type void*. Ainsi, la liste pouvait contenir des pointeurs sur n'importe quoi. En clair, la liste pouvait donc contenir n'importe quoi. Mais le soucis, c'est que je devais créer une fonction sort() associée à cette liste pour pouvoir comparer les élements à l'interieur ... Sauf que ces élements sont concidérés dans la liste comme des pointeurs du type void* ... Et donc impossible d'en faire quoi que ce soit.
La solution, c'est d'utiliser un pointeur de fonction sur une fonction de comparaison dont les paramètres sont du type void*, qui retourne un booléen (ou quoi que ce soit qui peut aider à comparer). Ce pointeur est alors utilisé comme paramètre de la fonction sort() dont je vous parlais précedement.
On doit ensuite donner la fonction adaptée aux élements présents dans la liste.
Dans l'exemple que je vous donne, c'est pas une liste, mais une simple fonction qui détermine si ces 2 premiers paramètres sont egaux, à l'aide du 3ème paramètre qui est en fait le pointeur sur la fonction de comparaison.
Source
- #include <stdio.h>
- #include <stdlib.h>
-
-
- typedef enum{TRUE = 1, FALSE = 0} tBoolean;
-
- #define and &&
-
-
- #define tElement void *
-
-
- typedef struct sComparator *tComparator;
- struct sComparator
- {
- tBoolean (*areEqual)(tElement, tElement);
- };
-
- tComparator Comparator_allocate()
- {
- return (tComparator)malloc(sizeof(struct sComparator));
- }
-
-
- typedef struct sInteger *tInteger;
- struct sInteger
- {
- int Value;
-
- tInteger (*create)(int);
-
- tComparator Comparator;
- };
-
- tInteger Integer_allocate()
- {
- return (tInteger)malloc(sizeof(struct sInteger));
- }
-
- tInteger Integer_create(int value)
- {
- tInteger This = Integer_allocate();
- This -> Value = value;
- return This;
- }
-
- tBoolean Integer_areEqual(tElement a, tElement b)
- {
- tInteger i = (tInteger)a;
- tInteger j = (tInteger)b;
-
- return (i -> Value) == (j -> Value);
- }
-
- tInteger Integer;
-
- void createIntegerType(void)
- {
- Integer = Integer_allocate();
- Integer -> create = Integer_create;
- tComparator comparator = Comparator_allocate();
- comparator -> areEqual = Integer_areEqual;
- Integer -> Comparator = comparator;
- }
-
-
- typedef struct sComplex *tComplex;
- struct sComplex
- {
- float RealPart;
- float ImaginaryPart;
-
- tComplex (*create)(float, float);
-
- tComparator Comparator;
- };
-
- tComplex Complex_allocate()
- {
- return (tComplex)malloc(sizeof(struct sComplex));
- }
-
- tComplex Complex_create(float real_part, float imaginary_part)
- {
- tComplex This = Complex_allocate();
- This -> RealPart = real_part;
- This -> ImaginaryPart = imaginary_part;
- return This;
- }
-
- tBoolean Complex_areEqual(tElement a, tElement b)
- {
- tComplex x = (tComplex)a;
- tComplex y = (tComplex)b;
-
- return ((x -> RealPart) == (y -> RealPart)) and ((x -> ImaginaryPart) == (y -> ImaginaryPart));
- }
-
- tComplex Complex;
-
- createComplexType()
- {
- Complex = Complex_allocate();
- tComparator comparator = Comparator_allocate();
- Complex -> create = Complex_create;
- comparator -> areEqual = Complex_areEqual;
- Complex -> Comparator = comparator;
- }
-
-
- tBoolean areEqual(tElement a, tElement b, tComparator comparator)
- {
- return comparator -> areEqual(a, b);
- }
-
- int main(void)
- {
- createIntegerType();
- createComplexType();
-
- tInteger i = Integer -> create(4);
- tInteger j = Integer -> create(4);
-
- tComplex x = Complex -> create(1, 1);
- tComplex y = Complex -> create(1, 1);
-
- tBoolean b;
-
- b = areEqual(i, j, Integer -> Comparator);
- if(b) printf("Oui ! Ces 2 entiers sont egaux ! \n");
-
- b = areEqual(x, y, Complex -> Comparator);
- if(b) printf("Oui ! Cest 2 complexes sont egaux ! \n");
-
- system("PAUSE");
- return 0;
- }
#include <stdio.h>
#include <stdlib.h>
typedef enum{TRUE = 1, FALSE = 0} tBoolean;
#define and &&
#define tElement void *
typedef struct sComparator *tComparator;
struct sComparator
{
tBoolean (*areEqual)(tElement, tElement);
};
tComparator Comparator_allocate()
{
return (tComparator)malloc(sizeof(struct sComparator));
}
typedef struct sInteger *tInteger;
struct sInteger
{
int Value;
tInteger (*create)(int);
tComparator Comparator;
};
tInteger Integer_allocate()
{
return (tInteger)malloc(sizeof(struct sInteger));
}
tInteger Integer_create(int value)
{
tInteger This = Integer_allocate();
This -> Value = value;
return This;
}
tBoolean Integer_areEqual(tElement a, tElement b)
{
tInteger i = (tInteger)a;
tInteger j = (tInteger)b;
return (i -> Value) == (j -> Value);
}
tInteger Integer;
void createIntegerType(void)
{
Integer = Integer_allocate();
Integer -> create = Integer_create;
tComparator comparator = Comparator_allocate();
comparator -> areEqual = Integer_areEqual;
Integer -> Comparator = comparator;
}
typedef struct sComplex *tComplex;
struct sComplex
{
float RealPart;
float ImaginaryPart;
tComplex (*create)(float, float);
tComparator Comparator;
};
tComplex Complex_allocate()
{
return (tComplex)malloc(sizeof(struct sComplex));
}
tComplex Complex_create(float real_part, float imaginary_part)
{
tComplex This = Complex_allocate();
This -> RealPart = real_part;
This -> ImaginaryPart = imaginary_part;
return This;
}
tBoolean Complex_areEqual(tElement a, tElement b)
{
tComplex x = (tComplex)a;
tComplex y = (tComplex)b;
return ((x -> RealPart) == (y -> RealPart)) and ((x -> ImaginaryPart) == (y -> ImaginaryPart));
}
tComplex Complex;
createComplexType()
{
Complex = Complex_allocate();
tComparator comparator = Comparator_allocate();
Complex -> create = Complex_create;
comparator -> areEqual = Complex_areEqual;
Complex -> Comparator = comparator;
}
tBoolean areEqual(tElement a, tElement b, tComparator comparator)
{
return comparator -> areEqual(a, b);
}
int main(void)
{
createIntegerType();
createComplexType();
tInteger i = Integer -> create(4);
tInteger j = Integer -> create(4);
tComplex x = Complex -> create(1, 1);
tComplex y = Complex -> create(1, 1);
tBoolean b;
b = areEqual(i, j, Integer -> Comparator);
if(b) printf("Oui ! Ces 2 entiers sont egaux ! \n");
b = areEqual(x, y, Complex -> Comparator);
if(b) printf("Oui ! Cest 2 complexes sont egaux ! \n");
system("PAUSE");
return 0;
}
Conclusion
J'ai rien trouver sur internet pour faire ce genre de chose et c'est pourquoi je le poste. De plus, j'ai codé de tel manière à ce que ça ressemble à de l'objet. Mais c'est pas le problème ici. En tout cas, le niveau de la source est expert parce que mine de rien, c'est pas mal tendu pour comprendre.
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
void comparaison [ par yopia ]
voila le principe g une liste de pointeurs (void*)comme ca on peut mettre nimporte quoi dans cte liste.le pb : comment faire pour comparer 2 élément e
Tri d'objets avec qsort. [ par Tazrael ]
Hum, voilà je souhaite trier un tableau d'objets avec qsort. Ici les objets sont des scores, et on y accède via un accesseur. Le problème c'est que la
"Comparaison" pointeur [ par LordBob ]
Bonjour a tous,voila j'ai des petits problèmes avec une application et mes pointeurs... en fait je récupéren en début de programme
Utilisation d'un pointeur de fonction membre [ par cyrcocq ]
Bonjour,J'ai déjà discuté de ça ailleurs, on m'a conseillé d'autres méthodes, mais imaginons une classe contenant un ens
liste chainée et pointeur générique ? [ par tintin72 ]
Bonjour, J'essaie de coder une liste chainée dont la valeur à stockée est matérialisé par un pointeur sur void de façon rendre mon code générique:
comparaison entre 2 fonctions [ par cyss ]
Est-ce que ces 2 fonctions sont equivalentes?void f1(char *t){ if (t!=0) { while(*t!=0) { cout<<*t; t
Pointeur sur fonction envoyé par dll [ par MoDDiB ]
Voila ce que j'ai fais mais ca ne marche pas :Dll :#include <windows.h>BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpR
pointeur static sur fonction :) [ par luhtor ]
Certain reconnaitront surement le tutoriel en question. J'ai rajouté quelques trucs au gestionnaire d'exception, mais je bloque sur le point suivant:J
Pointeur vers des fonctions membres d'une classe [ par thoflo1 ]
Bonjour, J'utilise une méthode d'une classe issue d'une librairie c++, qui prend un pointeur vers une fonction en argument : [code=cpp] typedef void (
Pointeur vers une fonction dans une classe ... [ par MoDDiB ]
Supposons que j'ai la fonctionvoid Fonction(int test,int t);appartenant a la classe Cclass.Quelle est la syntaxe pour creer un pointeur vers cette fon
|
Derniers Blogs
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|