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 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
écriture pointeur de struct [ par Vaughn018 ]
Bonjour j'ai un oubli complet (trop de code tue le code!) sur la façon d'écrire des données lorsqu'il s'agit du cas suivant :typedef struct Point{
|
Derniers Blogs
COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE?COMMENT MAPPER UNE VUE SQL SUR UNE COLLECTION DE COMPLEX TYPE? par Matthieu MEZIL
Avec EF, les vues doivent être mappées sur des entity types. Le problème c'est que les entity types doivent avoir une clé. Avec EF, nous avons les complex type qui n'ont pas de clé mais les vues ne peuvent pas être mappées dessus. Avec EF4, il est possibl...
Cliquez pour lire la suite de l'article par Matthieu MEZIL [WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL?[WF4] UN BINDING ACTIVITY/ACTIVITYDESIGNER QUI PASSE MAL? par JeremyJeanson
Certain d'entre vous on peut être vécu cette situation embarrassante après quelques temps passer avec WF4 : Au début avec mon " ActivityDesigner" , tout allait bien. Et puis un jour j'ai au des problèmes de " Binding" . Alors nous sommes allé sur le site ...
Cliquez pour lire la suite de l'article par JeremyJeanson MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ?MYTIC - SHAREPOINT 2010 : DéJà UN MYTHE MICROSOFT ? par junarnoalg
La prochaine session de MyTIC aura lieu à Namur, le 23 mars prochain. Pendant presque une heure, nous parlerons de SharePoint 2010. Voici un aperçu du programme.
Accueil : 17h30 Début de la session : 18h00 - Les nouvelles int...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
ERREUR DE POINTEURERREUR DE POINTEUR par africanwinners
Cliquez pour lire la suite par africanwinners
Logiciels
Academy System (10.9.4.0)ACADEMY SYSTEM (10.9.4.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Xilisoft Convertisseur Vidéo Ultimate (5.1.39.0305)XILISOFT CONVERTISSEUR VIDéO ULTIMATE (5.1.39.0305)Xilisoft Convertisseur Vidéo Ultimate est un outil puissant de conversion vidéo, facile à utilise... Cliquez pour télécharger Xilisoft Convertisseur Vidéo Ultimate Xilisoft DVD Ripper Ultimate (5.0.64.0304)XILISOFT DVD RIPPER ULTIMATE (5.0.64.0304)Xilisoft DVD Ripper Ultimate est un logiciel excellent pour copier et convertir DVD vers presque ... Cliquez pour télécharger Xilisoft DVD Ripper Ultimate Rigs of Rods (63.3)RIGS OF RODS (63.3)c'est un jeu de multi-simulation camions,autobus voitures, avions, bateaux, hélicoptère avec défo... Cliquez pour télécharger Rigs of Rods
|