[C] COMPARAISON GÉNÉRIQUE (OU COMMENT COMPARER DES ELEMENTS DU TYPE VOID * ...)

Signaler
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
-
LocalStone
Messages postés
514
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
1 mars 2009
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41084-c-comparaison-generique-ou-comment-comparer-des-elements-du-type-void

LocalStone
Messages postés
514
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
1 mars 2009

Grrr ... Je sais pas comment vous expliquer.
Je sais qu'il n'y a pas de référence en C. La manière dont le code est structuré permet dans ce cas de SIMULER des références, justement en cachant totalement la notion de pointeur. Naturellement, c'est stupide de faire ça, étant donné qu'il existe le Java, le C++, le C# et j'en passe et des meilleurs. Mais ! ... Bah dans le cadre de mon projet, je devais absolument le faire en C. C'est pour ça que j'ai du faire ça. Voilà voilà ...
cs_vicenzo
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010

Bon, LocalStone :

* primo : la notion de "référence" n'existe pas en C ! Donc dire : "je fais du C avec des références" est un non sens. En C il y des objets (au sens générique de variable et non en terme de poo) et des pointeurs sur ces objets !

* L'article que tu mentionnes "le C Objet" explique en fait l'idée qu'a eu un certain Bjarne Soustroup il y a 25 ans quant il a crée le "C with classes" qui est devenu le C++. Au début, le code "C with classes" était présenté à un précompileur qui se chargait de générer un code C dans le même esprit que celui de l'article...

* Si tu a besoin d'aide sur le C, n'hésites pas, demande !!!
LocalStone
Messages postés
514
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
1 mars 2009

:) En fait vous n'êtes pas encore prêt ...
Non, je plaisante. C'est vrai que j'ai pas trop expliqué pourquoi le code est un peu bizarre. En fait, j'ai appris le C cette année. Je connaissais déjà le Java, le C# et tout ça, mais je ne connaissais pas le C. Et il se trouve que dans l'école dans laquelle je me trouve, il nous appris à nous servir du C en utilisant que des références. En fait, ils pensaient déjà au semestre suivant : l'apprentissage du Java.
Du coup j'ai cherché et j'ai trouvé ça : http://chgi.developpez.com/c/objet/.
Et en fait, j'ai globalement suivi cette methode. J'ai seulement rajouté l'idée de l'instance porteuse de constructeut avec la variable globale dont le nom est presque identique au type.
Voilà voilà ... Maintenant, je suis d'accord, autant faire du C++. Bah ouais, mais je peux pas ... Pour l'instant :)
Dans l'espoir d'avoir été un peu mieux compris ...
cs_vicenzo
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010

simplicité est mère d'efficacité ! Pourquoi faire compliqué quand le problème est tout simple. !

C'est pourquoi, je ne pige pas le choix du niveau initié !

les pointeurs génériques et les pointeurs de fonction ont fait la force (puissance) du C et en même temps sa faiblesse (la + grande source de bug au monde !)

Donc, pour ta fonction sort, utilise qsort() en lui fournissant une fonction de tri de ton choix, tu ne pourra pas faire mieux, je pense !
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
Oui oui Vicenzo, c'est le type de code qu'on emploie ordinairement avec une fonction comme qsort(), très simple d'écriture et qu'un compilo correct optimisera parfaitement.
cs_vicenzo
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010

J'ai du mal a saisir l'utilité de ce code c++ dans le contexte c qui tu décris... Toute cette mayo bizarre pour un simple pointeur sur une fonction !!! Ton code fait 137 lignes. Voici une variante pure C de 45 lignes (soit 3 fois moins de code) et qui fait la même chose :

#include <stdio.h>
#include <stdlib.h>

typedef int (*cmp_fct_t)(void *, void*);

typedef struct complex_t
{
float real;
float imaginary;
} complex_t;

int equals(void *arg1, void *arg2, cmp_fct_t f)
{
return f(arg1, arg2);
}

int cmp_int(void *pi1, void *pi2)
{
return ((*(int*) pi1) == (*(int*) pi2));
}

int cmp_complex(void *pcpx1, void *pcpx2)
{
complex_t *cpx1 = (complex_t *) pcpx1;
complex_t *cpx2 = (complex_t *) pcpx2;

return ((cpx1->real cpx2->real) && (cpx1->imaginary cpx2->imaginary));
}

int main(void)
{
int i = 4;
int j = 4;

complex_t x = {1,1};
complex_t y = {1,2};

if (equals(&i, &j, cmp_int))
printf("Oui ! Ces 2 entiers sont egaux ! \n");

if (equals(&x, &y, cmp_complex))
printf("Oui ! Ces 2 complex sont egaux ! \n");

system("PAUSE");
return 0;
}
acx01b
Messages postés
280
Date d'inscription
dimanche 7 septembre 2003
Statut
Membre
Dernière intervention
8 juillet 2014
3
salut, je te donne mon avis
je trouve l'avantage du C++ c'est que quand c'est bien fait, c'est lisible, là ton code c'est un peu du langage codé je trouve qui va jusqu'à un
#define and &&
et
#define tElement void *
ou encore pire selon moi
typedef struct sComparator *tComparator;

pas bien ! on doit savoir quand on utilise un pointeur ou pas
( pour bien utiliser le free par exemple ! )

voila je trouve ça tarabiscôté
a+
LocalStone
Messages postés
514
Date d'inscription
mercredi 19 mars 2003
Statut
Membre
Dernière intervention
1 mars 2009

Tu as raison, c'est clair que l'on peut écrire ça, y a pas de soucis. Si j'ai fait tout ce bordel, c'était pour rendre l'ensemble corréhent. Si tu regardes, c'est codé un peu différement de ce que l'on peut voir d'habitude.
Ensuite, pour le pointeur ... Euh oui, c'est vrai. Mais l'idée, c'est d'avoir un pointeur void* comme paramètre.
Enfin, le #define and && ... Bah quoi ? Qu'est ce que ça peut faire ? Au lieu d'avoir à marquer a && b, j'ai juste à marquer a and b ... Je vois pas trop le soucis.
vecchio56
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tu montres comment on utilise un pointeur de fonction en gros, je vois pas ce qu'il y a de nouveau
Pour simplifier l'écriture, pourquoi ne pas écrire areEqual(i, j, Integer_areEqual);

Sinon, j'ai été assez étonné de voir la ligne #define and &&, il y a une raison particulière pour que tu mettes ca?