LES STRING EN C, AFFECTATION, CONCATÉNATION, SPLIT, ...
cs_NoMitsu
Messages postés122Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention15 février 2011
-
3 mars 2011 à 21:51
katycumon
Messages postés1Date d'inscriptionsamedi 6 mars 2010StatutMembreDernière intervention 1 mai 2011
-
1 mai 2011 à 00:26
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
katycumon
Messages postés1Date d'inscriptionsamedi 6 mars 2010StatutMembreDernière intervention 1 mai 2011 1 mai 2011 à 00:26
salut tout le monde.
J'ai un petit projet en C qui permet la saisi d'une fonction qlcq
et le calcul de son aire par 3 méthodes différentes.Maintenant j'ai établi le programme qui fait le calcul de l'aire de n'importe quelle fonction. Mais je me suis bloquée au niveau de la saisi de la fonction par clavier?
SVP j'ai besoin d'un programme en C qui permet la saisi d'une telle fonction??
merci de me répondre!
je suis à l'attente de vos réponses!
piergel
Messages postés51Date d'inscriptionlundi 8 septembre 2008StatutMembreDernière intervention18 août 2009 9 mars 2011 à 09:34
OK NoMitsu, belle démonstration ! je pensais pas qu'il pouvait y avoir une telle différence. Et voila qui va permettre à Appranting de rendre ses fonctions plus performantes et plus robustes !
cs_NoMitsu
Messages postés122Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention15 février 2011 9 mars 2011 à 00:03
je n'ai rien contre l'allocation dynamique. c'est le reste de l'implem qui me dérange.
tien juste par curiosité j'ai fait un petit bench de 4 bouts de code.
Tous on pour objectif de copier une chaine de 10mo et de libérer la mémoire après copy.
implem "homemade" utilise le code donne par appranting:
void execute(void)
{
MSTRING tmp;
affect(_string, tmp);
destroyM(tmp);
}
moyen pour 100 test 66279ms.
implem "cstring" identique a homemade mais avec les functions string de la libc:
void execute(void)
{
size_t size = strlen(_string);
char* data = static_cast<char*>(malloc((size + 1) * sizeof(*_string)));
if (data == NULL)
throw "bad alloc";
strcpy(data, _string);
free(data);
}
moyen pour 100 test 11304ms.
implem "strdup" simplification du "cstring" avec strdup:
void execute(void)
{
char* data = strdup(_string);
if (data == NULL)
throw "bad alloc";
free(data);
}
moyen pour 100 test 9013ms.
implem "stl" utilise la class string de la stl:
void execute(void)
{
std::string data(_string);
}
moyen pour 100 test 9228ms.
chseyler
Messages postés1Date d'inscriptionmercredi 5 mai 2010StatutMembreDernière intervention 7 mars 2011 7 mars 2011 à 17:44
C'est une blague ?
Rien que dans la fonction affect(), il y a buffer overflow ... J'ai pas été plus loin pour voir si le reste est de la même "qualité" ...
Un peu de rigueur SVP !
piergel
Messages postés51Date d'inscriptionlundi 8 septembre 2008StatutMembreDernière intervention18 août 2009 7 mars 2011 à 11:34
Même si je ne suis pas rentré dans le détail du code, moi je trouve que l'exercice est plutôt intéressant.
Pas d'accord avec NoMitsu sur la performance : tous les langages modernes qui permettent une gestion simple des chaines font de l'allocation dynamique donc à mon avis, les fonctions d'appranting sont compétitives en performance d'autant qu'elles restent simples.
Aucun problème non plus sur le passage des paramètres : certes ce ne sont pas des pointeurs mais des structures qui comportent un pointeur et un entier. Ce n'est pas très éloigné ! en tout cas, la chaîne en elle même (le tableau de char) n'est jamais passée en paramètre.
Là ou je suis d'accord avec NoMitsu par contre c'est sur le contrôle des malloc afin de s'assurer que l'allocation c'est bien passée.
cs_NoMitsu
Messages postés122Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention15 février 2011 3 mars 2011 à 21:51
se genre de gestion des strings est a proscrire et est peu performante. il faut mieux utiliser les fonctions de la libc dédier a la manipulation des string (strlen, strcpy ...).
En effet, pour passer les arguments MSTRING et PSTRING tu n'utilise pas de pointeur donc tu fait pour chaque appel une copie de la structure sur la stack. en plus tu n'utilise pas les fonctions de la libc qui sont bien plus performante que ton code et ensuite il faut absolument checker les valeurs de retour des syscall ! donc au lieu d'écrire par exemple ton affect comme tu l'as fait tu aurais du faire:
1 mai 2011 à 00:26
J'ai un petit projet en C qui permet la saisi d'une fonction qlcq
et le calcul de son aire par 3 méthodes différentes.Maintenant j'ai établi le programme qui fait le calcul de l'aire de n'importe quelle fonction. Mais je me suis bloquée au niveau de la saisi de la fonction par clavier?
SVP j'ai besoin d'un programme en C qui permet la saisi d'une telle fonction??
merci de me répondre!
je suis à l'attente de vos réponses!
9 mars 2011 à 09:34
9 mars 2011 à 00:03
tien juste par curiosité j'ai fait un petit bench de 4 bouts de code.
Tous on pour objectif de copier une chaine de 10mo et de libérer la mémoire après copy.
implem "homemade" utilise le code donne par appranting:
void execute(void)
{
MSTRING tmp;
affect(_string, tmp);
destroyM(tmp);
}
moyen pour 100 test 66279ms.
implem "cstring" identique a homemade mais avec les functions string de la libc:
void execute(void)
{
size_t size = strlen(_string);
char* data = static_cast<char*>(malloc((size + 1) * sizeof(*_string)));
if (data == NULL)
throw "bad alloc";
strcpy(data, _string);
free(data);
}
moyen pour 100 test 11304ms.
implem "strdup" simplification du "cstring" avec strdup:
void execute(void)
{
char* data = strdup(_string);
if (data == NULL)
throw "bad alloc";
free(data);
}
moyen pour 100 test 9013ms.
implem "stl" utilise la class string de la stl:
void execute(void)
{
std::string data(_string);
}
moyen pour 100 test 9228ms.
récapitulatif
strdup 9013ms référence
homemade 66279ms 635%
stl 9228ms 2%
cstring 11304ms 25%
7 mars 2011 à 17:44
Rien que dans la fonction affect(), il y a buffer overflow ... J'ai pas été plus loin pour voir si le reste est de la même "qualité" ...
Un peu de rigueur SVP !
7 mars 2011 à 11:34
Pas d'accord avec NoMitsu sur la performance : tous les langages modernes qui permettent une gestion simple des chaines font de l'allocation dynamique donc à mon avis, les fonctions d'appranting sont compétitives en performance d'autant qu'elles restent simples.
Aucun problème non plus sur le passage des paramètres : certes ce ne sont pas des pointeurs mais des structures qui comportent un pointeur et un entier. Ce n'est pas très éloigné ! en tout cas, la chaîne en elle même (le tableau de char) n'est jamais passée en paramètre.
Là ou je suis d'accord avec NoMitsu par contre c'est sur le contrôle des malloc afin de s'assurer que l'allocation c'est bien passée.
3 mars 2011 à 21:51
En effet, pour passer les arguments MSTRING et PSTRING tu n'utilise pas de pointeur donc tu fait pour chaque appel une copie de la structure sur la stack. en plus tu n'utilise pas les fonctions de la libc qui sont bien plus performante que ton code et ensuite il faut absolument checker les valeurs de retour des syscall ! donc au lieu d'écrire par exemple ton affect comme tu l'as fait tu aurais du faire:
MSTRING* affect(const char *valeur ,MSTRING* chaine)
{
chaine->taille = strlen(valeur); if ((chaine->text malloc((chain->taille + 1) * sizeof(char))) NULL)
return (NULL);
retun (strcmp(chaine->text, valeur));
}
se qui rend l'utilisation d'affect peu intéressante paraport a l'utilisation direct de la libc.