Page 1 sur 1

Lecture d'une liste récursive

Publié : mer. 13/avr./2016 9:24
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

Re: Lecture d'une liste récursive

Publié : mer. 13/avr./2016 11:15
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  

Re: Lecture d'une liste récursive

Publié : mer. 13/avr./2016 11:21
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