REPLACE(CHAR *, ...); UN REPLACE STYLE MIRC

NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011 - 21 mars 2005 à 22:52
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011 - 24 mars 2005 à 05:40
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/30230-replace-char-un-replace-style-mirc

NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
24 mars 2005 à 05:40
Excellent, de plus, sans `goto`, c'est parfait(enfin presque), ca vaut bien une petite note :}(même si je l'ai pas essayé =P)
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
22 mars 2005 à 19:26
Je viens de remarquer un petit quelque chose, ta fonction ToLower() n'est pas fonctionnelle ...

Tu devrais vérifier si c'est une majuscule et si c'est le cas, alors renvoyer l'équivalent minuscule car pour tous les caractères non `alpha`, ta fonction va retourner n'importe quoi ... Pour un chiffre, elle va retourner un caractère quelconque, par exemple ...

C'est bien, tu démontre seulement le fonctionnement de certaines fonctions standards, il n'y à aucun problème, cependant, elles ne sont pas fonctionnelles tes fonctions, c'est _ca_ le problème ... Tu devrais les repenser/corriger/tester/... et ensuite, je n'aurais plus rien à dire :}

J'ai remarqué autre chose, tu as modifié ton code pour utiliser les macros standards(portables :}), va_list, va_start, etc ... c'est excellent !!!

Au fait, pour en démontrer leurs fonctionnement, de petit commentaire pourait aider les débutants/initiés à mieux comprendre sinon, ton but de vouloir en démontrer leurs fonctionnement est inutile ...


Voilà, c'est tout :}

@++;



~(.:: NitRic ::.)~
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
22 mars 2005 à 07:31
Ah oui au passage... Thaeron, qu'est-ce qui est ``moin portable" dans mes fonctions ?
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
22 mars 2005 à 07:23
"Ta fonction (replace) utilise le tableau statique d'entrée ce qui entraine un joli segmentation fault quand la taille totale des remplacements dépasse la taille de la chaîne (l'exemple que tu as mis dans la description l'illustre parfaitement)."

La taille total du tableau est défini par REPLACE_SAVE_LEN et non REPLACE_MAX, donc pas de ``segmentation fault", sauf si tu dépasses les 1024, dans lequel cas tu peux incrémenter la valeur...

REPLACE_MAX n'est que le nombre d'arguments passés à la fonction
``replace("..", "1", "1", "2", "2", "3", "3", "4", "4", "5", "5", ..., 0);

Pour les fonctions, je répète... je les ai faites pour montrer comment elles marchent... Si vous voulez les fonctions POSIX, vous n'avez qu'a enlever les "__" devant les fonctions.
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
22 mars 2005 à 04:12
Je ne veux pas lancer de débat mais, c'est faux, elles ne sont pas `utilisées` souvent. Quand j'ai employé le mot souvent, je voulais dire _très_ souvent, ici dans un `replace()`, elles seront appelées que quelques fois, je pourais presque avoir assez de doigts pour les compter :}

Ton fameux `__strlen()` serait plus rapide sans le `i++` dans le while() car tu `force` le compilateur à vérifier à chaque tour la valeur de `i` ce qui est inutile et de plus, ta boucle ne fait qu'un seul et unique tour, pourquoi?

int i = 0;
while ( *a++ && i++ );

je sais pas si tu le sais mais, le i++ est interprété de cette facon:

while ( *a++ && i )
{
i = i + 1;
}

ce qui aurat comme effet d'entrer dans la boucle une fois et d'en sortie immédiatement, utilise plutôt ++i


size_t __strlen( const char * string )
{
const char * eos = string;
while ( *eos )
++eos;
return (eos - string);
}

Je veux bien croire que le type `int` est utilisé par défaut bien souvent mais tu devrais prendre l'habitude de le mettre ...


Au fait, <windows.h> n'inclus pas <stdio.h>, <stdlib.h> et compagnie, à moin d'avis contraire mais j'en suis quasi-certain ...

Au fait, on ne parle pas de nano-sec, ce n'est pas aussi rapide, car les chaines ne sont pas toujours de 10-20 caractères, on à souvent de longues chaines, ce qui pourait être domage de passer à coté de `strlen()`(version STD/ANSI) ...

Thaeron à raison, tu devrais faire quelque chose d'un peu plus `dynamique` avec malloc()/free(), ca serait encore mieux mais surtout plus `safe`

Il ne faut pas prendre tout ce que je dis de façon négative mais plutôt positive, `critiques constructives` !? :}


Sur ce, bye bye && bonne prog :}

@++;





~(.:: NitRic ::.)~
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
22 mars 2005 à 03:18
Ta fonction (replace) utilise le tableau statique d'entrée ce qui entraine un joli segmentation fault quand la taille totale des remplacements dépasse la taille de la chaîne (l'exemple que tu as mis dans la description l'illustre parfaitement). Il vaudrait mieux que tu utilises une chaîne dynamique dont tu retournerais l'adresse.

"Comme j'aime pas beaucoup les #include (pour leurs non portabilité ?),
j'ai pris l'habitude de recoder les fonctions qui me sont utiles dans les autres." Tu critiques les fonctions POSIX en disant qu'elles ne sont pas portables pour les recoder en plus lentes et encore moins portables !?!
Djoobstil Messages postés 38 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 22 mars 2005
21 mars 2005 à 23:07
Je refais pas les fonctions pour leurs "portabilité" mais, ça peut toujours aider de voir comment elles marchent...

pour les ``register", les algos ici requièrent une grande vitesse... puisqu'utilisés souvent.

Le ``SAVE_LEN" a été ajouté avant que tu ne poses ton commentaire (cf: Historique de cette source).

Quant au __strlen() plus lent que le standard, je dois dire que je suis bien désolé de te faire perdre quelques nanosecondes dans l'execution du programme.
NitRic Messages postés 402 Date d'inscription mardi 1 mai 2001 Statut Membre Dernière intervention 15 août 2011
21 mars 2005 à 22:52
La grande majoritée des fonctions que tu as `refait` sont ANSI donc ca assure une certaine portabilitée, strcmp(), strcpy(), islower(), isupper(), etc .. sont ANSI et présent sous Windows/Linux/etc ...

Tu as oublié d'inclure certains fichiers tel <stdio.h> pour printf() et <stdlib.h> pour system(), ...

Pour les fonctions qui prennent un nombres variables d'arguments, il existe encore quelque chose de standard(portable) => <stdarg.h>, ton code est beaucoup moin portable car la méthode pour récupérer les arguments n'est pas toujours la même ...

ta macro `SAVE_LEN` n'est pas définie et il manque aussi ton `__strlen()` qui est plus lent que le strlen() standard ...

Je pourais en avoir pour des heures mais j'vais arrêter ici, les libs standards n'existe pas pour rien, il faut les utiliser et personnellement, je préfèrerais utiliser les libs standards plutôt que tes fonctions, et de loin, désolé ...

Il n'y à aucun mal à `coder` en solitaire mais, tu publis tes sources alors un minimum de commentaire pourrait être bien, non ?

En passant, l'utilisation de `register` dans tes fonctions n'influence pas vraiment la rapidité du code, les compilateurs d'aujourd'hui sont suffisemment évolués et optimise très bien ce genre de code. L'utilisation abusive de `register` peut nuire bien souvent. Il est bien de l'utiliser lorsqu'un algo est appelé souvent et demande une grande vitesse d'exécution, sinon, c'est quasi-inutile ...

etc ...
etc ...
etc ...
...


~(.:: NitRic ::.)~
Rejoignez-nous