Procedure récursive

Programmation d'applications complexes
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Procedure récursive

Message par nico »

Je ne voudrais pas revenir là dessus mais il y a un code que je comprends qu'à moitié surtout que je ne comprends pas la fonction UseDirectory(directoryid).

@Flype, toi qui t'es beaucoup penché dessus, ce code de Sebi(Forum Anglais) que j'ai condensé fonctionne à merveille et sans ProcedureReturn de la fonction récursive. :? :x

Code : Tout sélectionner

Procedure.l ListFiles(directory.s , directoryid.l ) 
  Static a 
  ExamineDirectory(directoryid,directory,"*.*") 
  dirid=NextDirectoryEntry() 
  While dirid 
    If dirid=1
        file.s=DirectoryEntryName() 
            file.s=directory+"\"+DirectoryEntryName() 
            a=a+1
            Debug file 

          ElseIf dirid=2
            If Mid(DirectoryEntryName(),1,1)<>"." 
              Debug directory+"\"+DirectoryEntryName()
              ListFiles(directory+"\"+DirectoryEntryName(),directoryid+1)
          
              UseDirectory(directoryid) 
            EndIf 
    EndIf
    dirid=NextDirectoryEntry() 
  Wend 
  ProcedureReturn a 
EndProcedure 

Debug ListFiles("C:\Windows", 0) 


Je suis perdu pour l'instant! 8O
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ben dans la ligne juste au dessus, tu as DirectoryID+1.

Au départ, ton repertoire a lID 0

Ca veut dire que quand tu rappelles la procédure, le répertoire par défaut devient celui que la fonction vient de trouver, (ID+1). Elle va donc explorer ce nouveau repertoire, et si elle trouve un autre dossier, elle va encore ajouter 1 au n° (ID) du répertoire, et en faire le repertoire par défaut.

Et ainsi de suite, jusqu'à ce qu'elle ne trouve plus de dossier.

Chris :)
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

@nico

dans le post dont tu fais reference,

je disais que le procedurereturn n'est indispensable que pour certains algorithmes, pas tous. je t'ai meme donné des exemples où le procedurereturn n'etait pas obligatoire.

et en l'ocurrence, ici, on est face à un algo qui n'en a pas besoin.
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

sinon j'ai un peu modifié la procedure avec #PB_ANY ( PB 3.90 )
je l'a trouve un peu mieux comme çà...

Code : Tout sélectionner

Procedure.l ListFiles( directory.s )
  Static num.l
  id.l = ExamineDirectory( #PB_ANY, directory, "*.*" )
  Repeat
    type.l = NextDirectoryEntry()
    If type = 0 : ProcedureReturn num : EndIf
    name.s = DirectoryEntryName()
    full.s = directory + "\" + name
    Select type
      Case 1 : num + 1 : Debug full
      Case 2
        If name <> ".." And name <> "."
          ListFiles( full ) : UseDirectory( id )
        EndIf
    EndSelect
  ForEver
EndProcedure
  
Debug ListFiles("C:\Windows\system32")

@nico

UseDirectory() permet de remonter l'arborescence d'un cran
quand l'algo descend en profondeur pour aller lire le contenu
d'un dossier dans un dossier...
Image
Avatar de l’utilisateur
ZapMan
Messages : 460
Inscription : ven. 13/févr./2004 23:14
Localisation : France
Contact :

Message par ZapMan »

C'est du grand art !
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
jblaise.cs
Messages : 30
Inscription : lun. 26/avr./2004 11:30
Localisation : V'dauban
Contact :

Message par jblaise.cs »

est-ce que je peu utiliser ton code nico?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

C'est un code qui vient du forum anglais, mais vas-y c'est fait pour ça! les bouts de codes :D
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

ca aussi c cado :wink:

Code : Tout sélectionner

NewList FileList.s() 

Procedure.l EnumFilesEx(dir.s,total.l) 
  id=ExamineDirectory(#PB_Any,dir,"*.*") 
  Repeat 
    type=NextDirectoryEntry() 
    If type=0 
      ProcedureReturn total 
    EndIf 
    name$=DirectoryEntryName() 
    If type=1 
      total+1 : AddElement(FileList()) 
      FileList()=dir+"\"+name$ 
    ElseIf name$<>".." And name$<>"." 
      total=EnumFilesEx(dir+"\"+name$,total) : UseDirectory(id) 
    EndIf 
  ForEver 
EndProcedure 

Procedure.l EnumFiles(dir.s) 
  ClearList(FileList()) 
  ProcedureReturn EnumFilesEx(dir.s,0) 
EndProcedure 

; Exemple: Affichage des Dlls windows 

Debug EnumFiles("C:\Windows\system32")
ForEach FileList() 
  If GetExtensionPart(FileList())="dll" 
    Debug FileList() 
  EndIf 
Next 

; Exemple: Affichage des ocx windows 

Debug EnumFiles("C:\")
ForEach FileList() 
  If GetExtensionPart(FileList())="ocx" 
    Debug FileList() 
  EndIf 
Next 
Image
Répondre