Lecture d'une liste récursive

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Lecture d'une liste récursive

Message par microdevweb »

Bonjour à tous,

Imaginer que vous désirez faire une liste récursive. Je m'explique, lord du parcours d'une liste vous voulez ajouter un ou des éléments à la liste et les traité dans la même boucle.

Si vous utilisé classiquement ForEach cela ne fonctionnera pas.

Voici ici une méthode qui fonctionne (éditer)

Code : Tout sélectionner

Global nbListe=100
Global NewList teste.i()
; Exemple de lecture de liste dynamique
; j'ajoute un item à la liste pour pouvoir démarer
AddElement(teste())
teste()=1
ResetList(teste()) ; réinitialise la liste
Global Nb=ListSize(teste()) ; Nombre d'élément à la liste
; Avec une boucle Foreach je ne lirais que un élément
For N=1 To Nb
    SelectElement(dataPrj::myPrj\myFile(),N-1) ; j'avance dans la liste
    Debug "VALUES: "+Str(teste()) ; La valeur de l'ément ajouté avant
    If N<nbListe
        ; ICI j'ajoute un élément (pour l'exemple)
        AddElement(teste())
        teste()=N+1 ; une valeur quelconque pour le teste
        Nb=ListSize(teste()); Je change le nombre d'élement ainsi mon nouvelle élement poura être traité dans la boucle
    EndIf
Next
; Teste le résultat
; ForEach teste()
;     Debug Str(teste())
; Next
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Lecture d'une liste récursive

Message par falsam »

Pour un parcours de ce style il faut utiliser PushListPosition() et PopListPosition()

- PushListPosition() permet de mémoriser la position du pointeur de parcours d'une liste avant insertion d'autres éléments par exemple.
- PopListPosition() permet de revenir à la position mémorisée et de continuer la lecture séquentielle.

Exemple

Code : Tout sélectionner

Structure NewElement
  id.i
  tag.s  
  actif.i
EndStructure

Global NewList MyList.NewElement()

Procedure AddTag()
  AddElement(MyList())
  MyList()\id = ListIndex(MyList())
  MyList()\tag = "Tag " + Str(MyList()\id)
EndProcedure

;Quelques éléments de test
For n = 0 To 9
  AddTag()
Next

;Lecture séquentielle de la liste
ForEach MyList()
  If MyList()\id = 9
    ;Mémorisation de la position courante
    PushListPosition(MyList())
    
    ;Ajout de deux éléments
    AddTag()
    AddTag()
    
    ;Retour à la position avant insertion éléments
    PopListPosition(Mylist())
  EndIf
    
  Debug Str(MyList()\id) + " " + MyList()\tag
Next  
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Lecture d'une liste récursive

Message par microdevweb »

@Falsam,

Je penses que tu n'a pas bien compris ma démarche

Exemple dans le cadre du projet actuel:

Je liste les procédure d'un fichier Pb (Xinclude) en partant d'un fichier principal ex: main.pb
Donc en premier j'ajoute dans une liste le fichier principal

Dans une boucle je liste les fichier inclus, au départ un seul fichier
J'ajoute les fichier trouvé
Et comme je poursuit la liste avec les éléments ajoutés, je reprend le traitement pour chaque nouveau fichier

Bon je sais pas si c'est clair mais cela fonctionne
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre