guiguikun
Messages postés92Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention 1 octobre 2003
-
9 août 2003 à 15:35
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
9 août 2003 à 17:32
Cette fonction parse un buffer. Elle renvoit true si le flag est présent et false s'il ne l'est pas.
Je ne peux pas utiliser strstr() car le buffer comprend des "\0".
Lors du premier appel de cette fonction tout se déroule normalement, mais au 2eme appel, le programme plante à la ligne strncmp()
bool is_flag_present(char *buffer, unsigned long buffer_size)
{
char *ptr = buffer;
for (unsigned long i = 0 ; i < buffer_size ; i++) {
if ( !strncmp(ptr,flag,strlen(flag)) ) return 1;
ptr++;
}
return 0;
}
guiguikun
Messages postés92Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention 1 octobre 20031 9 août 2003 à 16:04
Oui j'en suis sur.
En plus pour débugger j'affichais chaque position de ptr a chaque fois que je l'incrémentais et ca plantait avant la fin du buffer...
guiguikun
Messages postés92Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention 1 octobre 20031 9 août 2003 à 16:18
Si puisque le buffer n'est rien d'autre que le return d'une fonction qui met un fichier dans un buffer.
Cette fonction return NULL si elle n'a pas réussi a ouvrir le fichier. c'est ce "NULL" qui posait problème
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 9 août 2003 à 16:34
1er point mais je pense que le compilo l'aurait resolu pour toi, ceci dit ne jamais penser que le compilo est intelligent.
Autre truc, regarde bien ta for et vois pourquoi tu peux reduire ses tours.
BruNews, ciao...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 9 août 2003 à 16:43
tu feras autant de tours pour rien que buffer_size-1
logique non ? si il n'y a plus le compte d'octets donc impossible de trouver.
Alors refais, enleve le i mais place un pointeur *pout precalcule:
while(ptr < pout).....
BruNews, ciao...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 9 août 2003 à 16:51
buffer de plusieurs Mo !!!
Revois ta copie alors, strstr est bien mieux optimise. Plus le compte entre 2 zeros est grand plus tu perdra de temps, il faut ici un algo Boyer Moore, genre strstr, le meilleur etant a mon avis celui de Michael Abrash. Vois si tu trouves par google.
BruNews, ciao...
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 9 août 2003 à 17:06
Tout a fait mais a ce rythme on finira par reecrire le strstr en C et on fera moins bien que la version ASM de strstr.
on reprend:
while(str < pout) {
if(strstr(str, flag)) return 1;
// ici donc non trouve
// ne pousse pas str de 1 mais jusqu'au prochain 0
}
return 0;
BruNews, ciao...