LocalStone
Messages postés514Date d'inscriptionmercredi 19 mars 2003StatutMembreDerniè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és178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 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és514Date d'inscriptionmercredi 19 mars 2003StatutMembreDerniè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és178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 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és21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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és178Date d'inscriptionmardi 16 août 2005StatutMembreDernière intervention25 août 20101 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 :
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és280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 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és514Date d'inscriptionmercredi 19 mars 2003StatutMembreDerniè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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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?
13 janv. 2007 à 14:54
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à ...
13 janv. 2007 à 13:38
* 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 !!!
13 janv. 2007 à 11:30
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 ...
13 janv. 2007 à 11:09
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 !
13 janv. 2007 à 03:26
12 janv. 2007 à 23:48
#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;
}
12 janv. 2007 à 23:46
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+
12 janv. 2007 à 22:19
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.
12 janv. 2007 à 22:06
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?