NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 août 2011
-
21 mars 2005 à 22:52
NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 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.
NitRic
Messages postés402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 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és402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 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és38Date d'inscriptiondimanche 10 août 2003StatutMembreDernière intervention22 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és38Date d'inscriptiondimanche 10 août 2003StatutMembreDernière intervention22 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és402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 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
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és202Date d'inscriptionvendredi 6 juillet 2001StatutMembreDernière intervention31 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és38Date d'inscriptiondimanche 10 août 2003StatutMembreDernière intervention22 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és402Date d'inscriptionmardi 1 mai 2001StatutMembreDernière intervention15 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 ...
24 mars 2005 à 05:40
22 mars 2005 à 19:26
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 ::.)~
22 mars 2005 à 07:31
22 mars 2005 à 07:23
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.
22 mars 2005 à 04:12
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 ::.)~
22 mars 2005 à 03:18
"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 !?!
21 mars 2005 à 23:07
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.
21 mars 2005 à 22:52
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 ::.)~