Page 1 sur 1
Globales qui disparaissent...
Publié : lun. 26/juil./2004 11:34
par Heis Spiter
Code : Tout sélectionner
Procedure ExamineFile(file$)
If ReadFile(2, file$)
ligne$ = ReadString()
While ligne$
ligne$ = LCase(ligne$)
If FindString(ligne$, "crack", 0)
crack = crack + 1
PrintN("Texte ill"+Chr(130)+"gal dans "+file$)
; fichier avec crack trouvé, crack = 1
EndIf
If FindString(ligne$, "warez", 0)
warez = warez + 1
PrintN("Texte ill"+Chr(130)+"gal dans "+file$)
EndIf
If FindString(ligne$, "gamez", 0)
gamez = gamez + 1
PrintN("Texte ill"+Chr(130)+"gal dans "+file$)
EndIf
If FindString(ligne$, "p2p", 0)
p2p = p2p + 1
PrintN("Texte ill"+Chr(130)+"gal dans "+file$)
EndIf
If FindString(ligne$, "sexe", 0)
sexe = sexe + 1
PrintN("Texte ill"+Chr(130)+"gal dans "+file$)
EndIf
ligne$ = ReadString()
Wend
Debug crack
CloseFile(2)
Else
Debug "Impossible de lire "+NextD$+DEN$
EndIf
EndProcedure
Procedure ExamineFDirectory(nbdirectory, directory$, type)
If ExamineDirectory(nbdirectory, directory$, "*.*")
NDE = NextDirectoryEntry()
While NDE <> 0
If NDE = 1
DEN$ = DirectoryEntryName()
If FileSize(directory$+DEN$) = 334101 And DEN$ = "install_templates.txt"
ignored = ignored+1
Else
ExamineFile(directory$+DEN$)
; le fichier avec le mot crack a été trouvé, crack = 1
EndIf
; crack = de nouveau 0 !!!
ElseIf NDE = 2
DEN$ = DirectoryEntryName()
If DEN$ <> "." And DEN$ <> ".."
If Right(DEN$, 1) <> "\"
DEN$ = DEN$ + "\"
EndIf
ExamineFDirectory(nbdirectory+1, directory$+DEN$, 2)
EndIf
EndIf
UseDirectory(nbdirectory)
NDE = NextDirectoryEntry()
Delay(1)
Wend
; crack = 0...
If type = 1
PrintN("R"+Chr(130)+"pertoire examin"+Chr(130)+" avec succ"+Chr(130)+"s")
If crack = 0 And warez = 0 And gamez = 0 And p2p = 0 And sexe = 0
PrintN("Rien d'ill"+Chr(130)+"gal n'a "+Chr(130)+"t"+Chr(130)+" trouv"+Chr(130)+" !")
Else
PrintN("crack = "+Str(crack))
PrintN("warez = "+Str(warez))
PrintN("gamez = "+Str(gamez))
PrintN("p2p = "+Str(p2p))
PrintN("sexe = "+Str(sexe))
EndIf
If ignored <> 0
PrintN(Str(ignored)+" fichier(s) ignor"+Chr(130)+"(s) !")
EndIf
EndIf
EndIf
EndProcedure
OpenConsole()
Global crack.l, warez.l, gamez.l, p2p.l, sexe.l, ignored.l
If ReadFile(1, "directories.conf")
NextD$ = ReadString()
While NextD$
If Left(NextD$, 1) <> "#"
If Right(NextD$, 1) <> "\"
NextD$ = NextD$ + "\"
EndIf
PrintN(NextD$)
ExamineFDirectory(3, NextD$, 1)
EndIf
UseFile(1)
NextD$ = ReadString()
Delay(1)
Wend
Else
PrintN("Impossible de lire le fichier de configuration !")
EndIf
PrintN("Appuyez sur une touche pour continuer...")
While Inkey() = ""
Delay(1)
Wend
End
Quelqu'un peut-il m'exliquer pourquoi, dans ce code les variables déclarées en globales ne se comportent pas normalement. Suivez les commentaire avec la variable crack...
Publié : lun. 26/juil./2004 12:00
par nico
J'ai regardé un peu le code, dans ta procédure ExamineFile(file$) , pour parcourir le fichier, tu fais While ligne$.......Wend, si tu as des sauts de lignes, la lecture s'arrêtera à la première ligne vide!
Ce n'est peut être pas le propos mais ça ne coute rien de te le signaler

Publié : lun. 26/juil./2004 12:09
par nico
La fonction ExamineFile(file$) à l'air de bien fonctionner si ce n'est le souci décrit plus haut et la variable crack me renvoie bien le nombre exact de ce mot trouvé dans le fichier (sans lignes vides bien entendu).

Publié : lun. 26/juil./2004 12:51
par Anonyme2
Il s'agit je pense d'un bug.
J'ai créé le fichier assembleur du code et voici le bout qui nous intéresse c'est-à-dire lorsque tu incrémente les variables et pour l'exemple crack.
Code : Tout sélectionner
; If FindString(ligne$, "crack", 0)
PUSH dword 0
PUSH dword _S1
MOV eax,dword [esp+12]
CALL PB_FindString
AND eax,eax
JE _EndIf5
; crack = crack + 1
INC dword [esp+8] <-- c'est ici, crack ici est considéré comme variable locale (sur la pile) et pas en globale (section data)
J'ai déplacé la ligne
je l'ai mise au tout début du code avant les procédures.
et voici le code assembleur correspondant qui maintenant est correct
Code : Tout sélectionner
; If FindString(ligne$, "crack", 0)
PUSH dword 0
PUSH dword _S1
MOV eax,dword [esp+12]
CALL PB_FindString
AND eax,eax
JE _EndIf5
; crack = crack + 1
INC dword [v_crack] <-- ici crack est une variable globale.
Il me semble avoir eu le problème il y a longtemps et je pense que c'est la fonction récursive qui cause un problème.
Publié : lun. 26/juil./2004 18:21
par nico
J'ai pu conclure avec des essais que les déclarations des variables globales ne donnaient pas le même résultat suivant où elles sont placées.
Donc si tu pouvais faire un essai, en déclarant tes variables globales en tout début de fichier!
ça devrait résoudre le problème.

Publié : lun. 26/juil./2004 18:54
par Anonyme2
Après réflexion, celà n'a peut-être pas une relation avec la récursivité.
Fred, tu fait combien de passes à la compil ?
Si une, alors il faudra peut-être en faire une deuxième ou alors avoir l'obligation de déclarer les globales au début.
Bon, Fred, tu fait comme tu veux

Publié : lun. 26/juil./2004 20:12
par Le Soldat Inconnu
y'a qu'une passe .. donc au début, quand on lit le code dans l'ordre, la variable crack n'est pas globale. elle ne l'est que pour le code principal.
même si la procedure est exécuter dans le code après le global, le programme est compilé dans l'ordre d'écriture donc pour qu'une viriable soit globale, elle doit être placé après le global.
c'est pas bête comme idée, Denis, de compiler en 2 passe. ça éviterait également les declare pour les procedures
Publié : ven. 30/juil./2004 10:01
par ZapMan
Ouais, mais ça ralentirait la compilation, et, au cas où vous ne l'auriez pas remarqué, Fred est obsédé par la vitesse. C'est quasiment une pathologie, chez lui. Peut-être qu'on lui a trop offert des voitures de course quand il était petit. Ou alors pas assez...
En tout cas, je crois que personne ne se plaint trop de cet aspect de sa personnalité.
Publié : ven. 30/juil./2004 23:51
par filperj
Le nombre de passes pourrait être dans les options du compilateur

Publié : sam. 31/juil./2004 7:01
par Anonyme2
filperj a écrit :Le nombre de passes pourrait être dans les options du compilateur

2 passes ralentit la compil mais ca permet d'éviter ces problèmes et tout comme éviter les Declare et pourrait aussi n'utiliser vraiment que les variables qui sont vraiment utilisées etc etc.
Mettre une option ca compliquerait l'analyse du compilateur.
Publié : sam. 31/juil./2004 10:07
par Backup
moi je suis pour 2 passes !
car pour avoir utilisé des compillateurs babic a plusieurs passes
je peut vous dire que le temps perdu a la compille n'est vraiment pas terrible
(de l'ordre de quelques secondes pour des gros projet !!!)
par contre effectivement cela permettrai a fred de generer un code encore plus optimisé !! , je pense ...
