cs_Batman60
Messages postés71Date d'inscriptionsamedi 21 mai 2005StatutMembreDernière intervention21 octobre 2007
-
1 juin 2006 à 18:42
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 2009
-
2 juin 2006 à 16:23
bonjour
comment procéder pour supprimer quelques derniers caractères d'une chaine
merci
char ChaineCaractères[MAX_PATH];
ben92600
Messages postés56Date d'inscriptiondimanche 13 novembre 2005StatutMembreDernière intervention11 juillet 2006 1 juin 2006 à 18:46
ba soit tu refait une chaine ou tu les retire soi tu renplace ces
carateres par des \0 pouisque ce son les dernier de la cahine sa posera
pas de probleme ;)
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 1 juin 2006 à 20:46
Tien j'ai fais un listing de ta fonction et de la mienne. Voici la tienne:
mov edx, DWORD PTR _value$[esp-4]
push edi
mov edi, edx
or ecx, -1
xor eax, eax
repne scasb
mov eax, DWORD PTR _count$[esp]
pop edi
not ecx
dec ecx
sub edx, eax
mov BYTE PTR [ecx+edx], 0
12 opérations et ce sans compter les opérations de strlen
Voici la mienne:
mov eax, DWORD PTR _value$[esp-4]
inc eax
cmp BYTE PTR [eax], 0
je SHORT $L57476
$L57475:
mov cl, BYTE PTR [eax+1]
inc eax
test cl, cl
jne SHORT $L57475
$L57476:
sub eax, DWORD PTR _count$[esp-4]
mov BYTE PTR [eax], 0
10 opérations
C'est pas moi qui a inventé ce codage. C'est généré avec le compilateur. En plus, j'ai activé les options du compilateur pour une optimisation de la vitesse.
___________________________________________
Les plus grands esprits trouvent toujours une solution
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 1 juin 2006 à 20:51
Et?? Tu vois comme ca laquelle est la plus rapide? Une code plus court n'est pas forcément plus rapide
Peut être que ta fonction est plus rapide, mais faudrait tester pour voir.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 1 juin 2006 à 20:56
Ahhh si BruNews passait par ici, il nous dirait ça tout de suite lui. Bon je vais essayer de tester la rapidité. Je reviend avec les resultats plus tard.
___________________________________________
Les plus grands esprits trouvent toujours une solution
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 1 juin 2006 à 21:13
Hihihi ses codes ne sont pas de tout repos. Bon, j'ai patenté un peu le code pour qu'il teste nos 2 fonctions. J'ai tester 4 fois et j'ai fait une moyenne:
Ta fonction: 992
Ma fonction: 158
Voila. Je te jure que je n'est pas trafiqué les resultats.
___________________________________________
Les plus grands esprits trouvent toujours une solution
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 1 juin 2006 à 21:14
pas le temps d'essayer mais, quel compilo a généré du 'repne scasb' ??? ces antiques instructions de chaine sont à proscrire, elles forcent une sauvegarde de EDI et sont bien plus lentes qu'une boucle ordinaire. Intel en préconisait l'abandon depuis le pentium.
while(*(++c)); Si la chaine est vide (1er octet deja 0), tu pars au dela. Pas forcément grave mais est-ce le but ???
while(count--) *(--c) = 0;
Enorme le risque de plantage, quand on isole dans une fonction c'est qu'elle est dument testée, count pourrait être largement supérieur au strlen() et en ce cas....
void EraseLastChar(char *value, int count)
{
char *c = value;
while(*c) c++; // CERTAIN SE STOPPER AU ZERO
c -= count; if(c >value) *c 0;
else value[0] = 0; // BON A TOUT COUP
}
Ceci dit je trouve ce genre de fonction totalement inutile, avec un mois de dev on écrit cela comme on respire donc on le met direct dans le code quand besoin sans appel de fonction.
Laissez donc les snippets aux dotnetteurs, n'a aucun intérêt réel en C/C++ ou alors serait un gros morceau de code.
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 1 juin 2006 à 22:44
Je note. Merci pour les corrections et pour le conseil sur Codyx.
En passent, je sais bien que faire une fonction pour si peu est inutile mais c'est pour montrer le principe mais bon, si tu dit que ça n'a pas sa place sur Codyx, je ne vais pas te contredire. Après tout, c'est toi le pro :) .
___________________________________________
Les plus grands esprits trouvent toujours une solution