dark_naruto25
Messages postés127Date d'inscriptionmardi 23 août 2005StatutMembreDernière intervention 9 mai 2011 21 déc. 2005 à 13:18
taille c'est la paramètre passé à la fonction, je mets : sizeof(chaine)/sizeof(char), ce qui en théorie me retourne la taille du tableau de caractère y compris le '\0' de la fin.
chaine c'est la chaine de caractères que je passe à la fonction, c'est cette chaine dont je dois enlevé les ' ' et '\ '. caracteres c'est une chaine contenant les caractères pouvant intervenir dans chaine et qu'il faut préserver.
dark_naruto25
Messages postés127Date d'inscriptionmardi 23 août 2005StatutMembreDernière intervention 9 mai 2011 21 déc. 2005 à 15:13
OK, c'est le même principe que je voulais faire, ta boucle dans
suppDevant est infie j'ai l'impression. JE vais essayer de mettre ça en
oeuvre à ma sauce. merci
Mais pourquoi tu vérifis si le caractère est vide ?
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 21 déc. 2005 à 15:23
Et non elle n'est pas infinie, parce que si le premier caractère n'est
pas un espace, il ne rentre pas dans la boucle, et donc Index = 0, donc
il y a bien 0 espace devant ;)
if(!Meilleur("Joky")) return ERREUR;<
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 21 déc. 2005 à 15:24
while(*d-- == ' ')
*d = 0;
Ca sert a rien de mettre des zeros partout, seul le dernier est important
while(*d-- == ' ');
*d = 0;
Les deux strcpy dans SuppDevant sont pas très efficaces. Il suffit en fait d'avoir le décalage (nombre d'espaces) et de faire
while(*(sz + dec))
{
*sz = *(sz + dec);
sz++;
}
*sz = 0;
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 21 déc. 2005 à 17:31
memset(chaine2,0,sizeof(chaine2));
Ca ne va pas faire ce que tu veux, car sizeof chaine2 retournera TOUJOURS 4
Aussi, je trouve ca assez fort de faire une allocation pour une fonction trim!
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 21 déc. 2005 à 23:36
__declspec(naked) int __fastcall bntrim(char* psrc)
{ // ECX = psrc
__asm {
mov [esp-4], ecx
mov eax, ecx
Ltrm1:
mov dl, [ecx]
inc ecx
cmp dl, 32
je short Ltrm1
dec ecx
dec eax
Ltrm2:
mov dl, [ecx]
inc eax
inc ecx
mov [eax], dl
test dl, dl
jnz short Ltrm2
mov ecx, [esp-4]
Ltrm3:
mov byte ptr[eax], 0
cmp eax, ecx
jna short Ltrm4
dec eax
cmp byte ptr[eax], 32
je short Ltrm3
inc eax
Ltrm4:
sub eax, ecx
ret 0
}
}
La chaine est passée en registre à la fonction et tout est fait en interne en un minimum de cycles.
Vous aurez en plus le nombre de caractères restants dans la chaine en retour (utile pour chainage direct sans strcat).
dark_naruto25
Messages postés127Date d'inscriptionmardi 23 août 2005StatutMembreDernière intervention 9 mai 2011 22 déc. 2005 à 11:23
BruNews > ton idée est pas mal, enfin je ne connais pas à fond
l'assembleur. Pour le moment je ne cherche pas à optimiser mon code, il
est suffisament rapide comme ça.
Plus tard quand je me serais mis à l'assembleur je referais certaine de mes fonctions en assembleur histoire d'optimiser.
vecchio56 > à la place de sizeof(chaine2), je mets quoi ?
dark_naruto25
Messages postés127Date d'inscriptionmardi 23 août 2005StatutMembreDernière intervention 9 mai 2011 23 déc. 2005 à 15:26
strlen(chaine2) retourne le nombre de caractères de chaine2 avant le premier '\0', hors moi je veux mettre des '\0' sur la totalité des cases de chaine2, pour faire propre quoi.