Liste chainées : SwapElements()

Archive.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Liste chainées : SwapElements()

Message par Chris »

Je ne sais pas si c'est un bug, mais SwapElement() fonctionne bizarrement quand une liste chainée n'est pas combinée à une structure.

Un petit code valant mieux qu'un long discours, passez celui-ci au débugger en modifiant la valeur de la constante #Test
(#Test = 1 : La liste chainée est combinée à une structure, #Test = 0, Liste chainée "normale").

Vous remarquerez, au passage, que les codes des deux procédure sont absolument identique, à part pour le nom des listes

Code : Tout sélectionner

Structure TEST
  Liste.s
EndStructure

NewList MaListe1.s()
NewList MaListe2.TEST()


Procedure TestMyList_1()
  
  For i = 65 To 90
    AddElement(MaListe1())
    MaListe1() = Chr(i)
  Next
  
  
  For i = 0 To 50
    C1 = Random(20)
    C2 = Random(20)
    
    If C1 <> C2
      SelectElement(MaListe1(), C1)
      *Pointer1 = @MaListe1()
      
      SelectElement(MaListe1(), C2)
      *Pointer2 = @MaListe1()
      
      SwapElements(MaListe1(), *Pointer1, *Pointer2)
    EndIf
  Next
EndProcedure

Procedure TestMyList_2()
  
  For i = 65 To 90
    AddElement(MaListe2())
    MaListe2()\Liste = Chr(i)
  Next
  
  
  For i = 0 To 50
    C1 = Random(20)
    C2 = Random(20)
    
    If C1 <> C2
      SelectElement(MaListe2(), C1)
      *Pointer1 = @MaListe2()
      
      SelectElement(MaListe2(), C2)
      *Pointer2 = @MaListe2()
      
      SwapElements(MaListe2(), *Pointer1, *Pointer2)
    EndIf
  Next
EndProcedure

;- Modifier la valeur de la constante pour les tests
#Test = 1
;-

If #Test = 0
  TestMyList_1()
  
  ForEach MaListe1()
    Debug MaListe1()
  Next
ElseIf #Test = 1
  TestMyList_2()
  
  ForEach MaListe2()
    Debug MaListe2()\Liste
  Next
EndIf
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

En effet, pour une liste de type string, le pointeur du string est renvoyé au lieu du pointeur de l'élément de la liste. Pour tous les autres cas (.l etc.) ca fonctionne correctement. Je vais changer ca, mais j'avoue que ca pose un probleme pas evident.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Personnellement, maintenant que je le sais, ça ne me gène pas de passer par une structure pour les types .s, mais c'est vrai que si tous les types étaient pareils, ce serait plus pratique.

Cela dit, pour moi, il n'y a rien qui presse :wink:
Répondre