Globales qui disparaissent...

Programmation d'applications complexes
Heis Spiter
Messages : 1092
Inscription : mer. 28/janv./2004 16:22
Localisation : 76
Contact :

Globales qui disparaissent...

Message 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...
Heis Spiter, webmaster du site http://www.heisspiter.net
Développeur principal et administrateur du projet Bird Chat
Parti courir au bonheur du dév. public et GPL :D
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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 :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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).


:)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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

Code : Tout sélectionner

Global crack.l, warez.l, gamez.l, p2p.l, sexe.l, ignored.l
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.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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. :wink:

:)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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 :D
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message 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é.
Tout obstacle est un point d'appui potentiel.

Bibliothèques PureBasic et autres codes à télécharger :https://www.editions-humanis.com/downlo ... ads_FR.htm
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message par filperj »

Le nombre de passes pourrait être dans les options du compilateur :roll:
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

filperj a écrit :Le nombre de passes pourrait être dans les options du compilateur :roll:
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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 ... :)
Répondre