Page 1 sur 1

DeleteElement() avec le second paramètre

Publié : mer. 09/nov./2005 19:58
par Anonyme2
Voici 3 codes

1 boucle foreach et DeleleteElement() avec 2nd paramètre
1 boucle for pas positif et DeleleteElement() avec 2nd paramètre
1 boucle for pas négatif et DeleleteElement() avec 2nd paramètre (ce n'est pas le step -1 qui est important mais le fait que l'on efface à la fin)

la boucle foreach ne fonctionne pas correctement, il reste un élément et c'est le second de la liste d'origine

les 2 autres boucles fonctionnent correctement

Code : Tout sélectionner

NewList Essai()

For i = 6 To 15
  AddElement(Essai())
  Essai() = i
Next 
; ici on a 10 éléments dans la liste chainée
Debug "Nombre d'élément avant suppression   "+Str(CountList(Essai()))

; On efface tous les éléments
ForEach Essai()
     DeleteElement(Essai(), 1)
Next

; ici on ne devrait plus avoir d'élément
Debug "Nombre d'élément après suppression   "+Str(CountList(Essai()))
If CountList(Essai()) >0
   Debug "L'élément restant vaut    " +Str(Essai())
EndIf



;*************************************************
; autre exemple d'une boucle for qui cette fois fonctionne
Debug ""
Debug ""

ClearList(Essai())
For i = 6 To 15
  AddElement(Essai())
  Essai() = i
Next 

; ici on a 10 éléments dans la liste chainée
FirstElement(Essai())
Debug "Nombre d'élément avant suppression   "+Str(CountList(Essai()))

For i = 6 To 15
     DeleteElement(Essai(), 1)
Next

; ici on ne devrait plus avoir d'élément

Debug "Nombre d'élément après suppression   "+Str(CountList(Essai()))
If CountList(Essai()) >0
   Debug "L'élément restant vaut    " +Str(Essai())
EndIf



;*************************************************
; autre exemple d'une boucle for qui cette fois fonctionne
Debug ""
Debug ""

ClearList(Essai())
For i = 6 To 15
  AddElement(Essai())
  Essai() = i
Next 

; ici on a 10 éléments dans la liste chainée

Debug "Nombre d'élément avant suppression   "+Str(CountList(Essai()))

LastElement(Essai())  ; on se positionne à la fin

For i = 15 To 6 Step -1
     DeleteElement(Essai(), 1)
Next

; ici on ne devrait plus avoir d'élément

Debug "Nombre d'élément après suppression   "+Str(CountList(Essai()))
If CountList(Essai()) >0
   Debug "L'élément restant vaut    " +Str(Essai())
EndIf

Publié : mer. 09/nov./2005 21:13
par nico
Bien vu Denis! :?

Publié : mer. 09/nov./2005 23:19
par Oliv
A mon avis ce n'est pas un bug (ou il vient de toi :P ) : ForEach prend l'element suivant l'élément courant, or, lorsque qu'il y a 1 en paramètre, le premier élément de la liste est selectionné après DeleteElements(), donc lors du recommencement de la boucle, ont selectionne le suivant, c'est à dire le deuxième, ainsi, on aura jamais le deuxième élément effacé, je pense mieux m'exprimmer dans les commentaires :

Code : Tout sélectionner

NewList Essai() 

For i = 6 To 15 
  AddElement(Essai()) 
  Essai() = i 
Next 
; ici on a 10 éléments dans la liste chainée 
; Debug "Nombre d'élément avant suppression   "+Str(CountList(Essai())) 

; On efface tous les éléments sauf le deuxième de la liste.
ForEach Essai() 
    ; Au début on a 6 puis 8,9,10,11,12,13,14,15
    Debug "Avant d'éffacer : " + Str(Essai())
    DeleteElement(Essai(),1) 
    ; Ensuite on a 7 constant car il est selectionné après le premier DeleteElement(Essai(),1),
    ; ensuite le ForEach fait passer à l'élément suivant donc le boucles d'après on effacera 8,9,...,15
    ; mais à chaque fois on reviendra à 7 après le DeleteElement(Essai(),1)
    Debug "Après avoir effacé : " + Str(Essai())
    Debug ""
Next 

Publié : jeu. 10/nov./2005 6:23
par Anonyme2
Tu as raison Oliv,
le bug est dans ma tête :D

Il vaut mieux utiliser une boucle for (pas positif) qui n'effacera que le premier élément à chaque tour si on utilise 1 en second paramètre.

Publié : mar. 13/déc./2005 0:25
par Fred
Exact. C'est a cause du ForEach que ce comportement avait été modifié (et le parametre optionnel ajouté).

Publié : mar. 13/déc./2005 17:13
par Anonyme2
Fred a écrit :Exact. C'est a cause du ForEach que ce comportement avait été modifié (et le parametre optionnel ajouté).
Oui, maintenant que tu le dis, je me souviens