Beta 3 : Manifique bug de ListIndex()

Archive.
Gratteur
Messages : 147
Inscription : ven. 22/avr./2005 23:02

Beta 3 : Manifique bug de ListIndex()

Message par Gratteur »

Code : Tout sélectionner

NewList code()
InsertElement(code())
code() = 3

Debug ListIndex(code()) ; ListIndex renvoit -1 à la place de 0

Debug code() ; La liste fonctionne malgrès tout
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Beta 3 : Manifique bug de ListIndex()

Message par Backup »

Gratteur a écrit :

Code : Tout sélectionner

NewList code()
InsertElement(code())
code() = 3

Debug ListIndex(code()) ; ListIndex renvoit -1 à la place de 0

Debug code() ; La liste fonctionne malgrès tout
la doc dit :
Renvoie dans Index la position de l'élément courant

c'est normal, puisque avant de la lire, on commence toujours avant le premier element !! (c'est a dire -1 car -1 c'est avant Zero !! :) )


CallDebugger
NewList code()
InsertElement (code())
code() = 3

Debug ListIndex (code()) ; -1 parceque l'on a pas commencé a lire !! (on est donc avant le zero soit -1)

Resultat = NextElement (code() ) ; on lit le premier element cela avance le pointeur de lecture a l'element 0 !!!

Debug code() ; il renvoi 3 normal !!! : D
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

C'est même étonnant que le compilo dise rien, dans un cas pareil.
Anonyme

Message par Anonyme »

La doc dit :
Insère un nouvel élément avant l'élément courant, ou au début de la liste si la liste est vide (c-a-d si elle ne contient pas d'élément). Ce nouvel élément devient l'élément courant de la liste.
utilise AddElement(), cela renvois 0.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

@Dobro
Quoi que tu en dise, pour moi, il y a bien un bug.

NewList code() ; Tu pars d'une liste totalement vide
InsertElement(code()) ; Tu ajoutes un élément.

Insère un nouvel élément avant l'élément courant, ou au début de la liste si la liste est vide (c-a-d si elle ne contient pas d'élément). Ce nouvel élément devient l'élément courant de la liste.

Le premier élément d'une liste, c'est bien toujours 0. Pas -1

L'élément courant est celui qu'on vient d'ajouter dans la liste qui était vide, donc ListIndex() devrait bien être 0, et non -1
Anonyme

Message par Anonyme »

Donc , y a bien un bug. :D
Gratteur
Messages : 147
Inscription : ven. 22/avr./2005 23:02

Message par Gratteur »

Bien sur qu'il y a un bug, vous m'avez fait peur :P
Dernière modification par Gratteur le sam. 18/août/2007 21:02, modifié 2 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ben oui. Le bug, c'est que ListIndex() n'est pas remis à jour quand tu insères un élément.

Code : Tout sélectionner

NewList code()
InsertElement(code()) : code() = 3

Debug ListIndex(code()) ; ListIndex renvoit -1 à la place de 0
Debug code() ; La liste fonctionne malgrès tout
ForEach code():Next ; On fait un tour de la liste, et ListIndex est remis à jour
Debug ListIndex(code()) ; ListIndex renvoit  0
Gratteur
Messages : 147
Inscription : ven. 22/avr./2005 23:02

Message par Gratteur »

Donc en attendant :

Code : Tout sélectionner

PreviousElement() + AddElement() = InsertElement()
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ou tu fais un tour pour rien pour remettre le pointeur de l'index à jour.

Code : Tout sélectionner

ForEach code():Next
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Chris a écrit :Ben oui. Le bug, c'est que ListIndex() n'est pas remis à jour quand tu insères un élément.
ben peut etre, faudrai en parler au forum anglais,pour voir
c'est embetant, parceque si c'est un bug, je vais avoir pas mal de chose a changer dans mon pureGolo3D a la prochaine mise a jour de Purebasic ....

toute ma pile repose sur une liste chainée ! :? :lol:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

En fait, le bug n'existe pas si tu insères un élément dans une liste contenant déjà des éléments.

Il n'apparait que dans une liste vide.

Code : Tout sélectionner

NewList Code()

For i = 0 To 20
  AddElement(Code()) : Code() = i
Next

; On sélectionne le 11 eme élément, et on insère une valeur de 125
SelectElement(Code(), 11) :             Debug Str(ListIndex(Code()))+" - "+Str(Code())
InsertElement(Code()) : Code() = 125 :  Debug Str(ListIndex(Code()))+" - "+Str(Code())

Debug " ---------------------------------------- "
; CallDebugger
ForEach Code()
  Debug Str(ListIndex(Code()))+" - "+Str(Code())
Next
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Chris a écrit :En fait, le bug n'existe pas si tu insères un élément dans une liste contenant déjà des éléments.

Il n'apparait que dans une liste vide.
oui , mais j'espere qu'une correction éventuelle, ne va pas tout chambouler le fonctionnement :)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

De toute façon, attention si vous voulez remplir toute une liste en utilisant uniquement la fonction InsertElement().

Les valeurs seront inversées dans la liste. La dernière entrée sera en début de liste puisque InsertElement() place la valeur AVANT l'élément courant. :wink:

Code : Tout sélectionner

NewList Code1()

For i = 0 To 20
  InsertElement(Code1()) : Code1() = i
Next

Debug " ---------------------------------------- "

ForEach Code1()
  Debug "Index "+Str(ListIndex(Code1()))+" - Valeur "+Str(Code1())
Next
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Chris a écrit :De toute façon, attention si vous voulez remplir toute une liste en utilisant uniquement la fonction InsertElement().

Les valeurs seront inversées dans la liste. La dernière entrée sera en début de liste puisque InsertElement() place la valeur AVANT l'élément courant. :wink:
genial pour simuler une pile LIFO :D
Répondre