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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 12 janv. 2007 à 22:06
LocalStone Messages postés 514 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 1 mars 2009 - 13 janv. 2007 à 14:54
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
13 janv. 2007 à 14:54
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 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
13 janv. 2007 à 13:38
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
13 janv. 2007 à 11:30
:) 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 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
13 janv. 2007 à 11:09
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 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 janv. 2007 à 03:26
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 178 Date d'inscription mardi 16 août 2005 Statut Membre Dernière intervention 25 août 2010 1
12 janv. 2007 à 23:48
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 6
12 janv. 2007 à 23:46
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
12 janv. 2007 à 22:19
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 Membre Dernière intervention 22 août 2010 14
12 janv. 2007 à 22:06
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?
Rejoignez-nous