LES STRING EN C, AFFECTATION, CONCATÉNATION, SPLIT, ...

cs_NoMitsu Messages postés 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 février 2011 - 3 mars 2011 à 21:51
katycumon Messages postés 1 Date d'inscription samedi 6 mars 2010 Statut Membre Derniè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.

https://codes-sources.commentcamarche.net/source/52876-les-string-en-c-affectation-concatenation-split

katycumon Messages postés 1 Date d'inscription samedi 6 mars 2010 Statut Membre Derniè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és 51 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 18 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és 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 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.

récapitulatif

strdup 9013ms référence
homemade 66279ms 635%
stl 9228ms 2%
cstring 11304ms 25%
chseyler Messages postés 1 Date d'inscription mercredi 5 mai 2010 Statut Membre Derniè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és 51 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 18 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és 122 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 15 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:

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.
Rejoignez-nous