Page 1 sur 1
Liste chainées, pointeurs et threads
Publié : sam. 22/déc./2007 23:40
par Oliv
Bonjour,
Jai beau essayer, je n'arrive pas envoyer une liste chainée en paramètre d'un thread, j'ai essayer de récupérer le pointeur vers le premier élement, de me balader dans la liste grace aux pointeurs qui sont dans les 8 premiers bits, mais le problème est que ma liste contient des chaiens de caractères, donc je ne vois pas comment déteriner la longueur des chaines pour les récupérer.
Voyez vous comment faire ?
Merci
Publié : dim. 23/déc./2007 1:27
par lionel_om
Ca n'a pas l'air compliqué pourtant.
Ce code peut t'aider :
Code : Tout sélectionner
Structure MaStructure
Champ1.f
Champ2.s
EndStructure
;PureBasic ajoute lui-même le Next et le Previous
NewList Maliste.MaStructure() ;Déclare une liste chainée
Declare TestList(*ptr)
;Ensuite tu peux ajouter un élément à la liste
AddElement(Maliste())
; mémorise le point de la liste créée
*liste = @Maliste()
Maliste()\Champ1 = 34.23
Maliste()\Champ2 = "Salut"
;Ajoute un autre élément
*pointeur.MaStructure = AddElement(Maliste())
Maliste()\Champ1 = 87.81
Maliste()\Champ2 = "au revoir"
TestList(*liste)
; partie de manipulation des pointeurs
*pointeur = PeekL(*pointeur+4) ; recupère le pointeur vers la précédente structure
Debug PeekF(*pointeur+8) ; affiche la première donné
; si on veut passer par les champ, faut ajouter au pointeur les
; 2x4 octets des deux Next/Previous ajouté par PB dans ta structure
*champ.MaStructure = *pointeur+8
Debug *champ\Champ1 ; et on peut lire les champs
Debug *champ\Champ2
Debug "============"
; meme principe pour le suivant
*pointeur = PeekL(*pointeur) ; récupère le suivant cette fois
Debug PeekF(*pointeur+8) ; affiche la première donné
*champ.MaStructure = *pointeur+8
Debug *champ\Champ1 ; et on peut lire les champs
Debug *champ\Champ2
Debug "============"
;tu peux visualiser le contenu de ta liste
Debug "***********"
ForEach Maliste()
Debug Maliste()\Champ1
Debug Maliste()\Champ2
Debug "***********"
Next
; procedure quelconque
Procedure TestList(*ptr)
Protected NewList Uneliste.MaStructure()
ChangeCurrentElement(Uneliste(), *ptr)
AddElement(Uneliste())
Uneliste()\Champ1 = 66.23
Uneliste()\Champ2 = "Trois"
EndProcedure
; IDE Options = PureBasic v4.00 (Windows - x86)
; CursorPosition = 52
; FirstLine = 18
Je ne sais plus d'où il vient.
Lio

Publié : dim. 23/déc./2007 9:52
par Oliv
merci, ce code vient du forum, je m'étais basé dessus pour mes test. Comme tu le dis ce n'est pas compliqué, je ne sais pas pourquoi j'ai bloqué dessus. Voici un exemple :
Code : Tout sélectionner
Structure MaStructure
Champ1.s
Champ2.s
EndStructure
;PureBasic ajoute lui-même le Next et le Previous
NewList Maliste.MaStructure() ;Déclare une liste chainée
Declare TestList(*ptr)
;Ensuite tu peux ajouter un élément à la liste
*liste = AddElement(Maliste())
; mémorise le point de la liste créée
Maliste()\Champ1 = "34.23 "
Maliste()\Champ2 = "Salut"
AddElement(Maliste())
Maliste()\Champ1 = "87.81 "
Maliste()\Champ2 = "au revoir"
TestList(*liste)
; procedure quelconque
Procedure TestList(*ptr)
Protected NewList Uneliste.MaStructure()
If *ptr ; Si la liste n'est pas vide
Repeat
*Champ.Mastructure = *ptr + 8 ; On lit la structure
Debug "-------"
Debug *Champ\Champ1
Debug *Champ\Champ2
*ptr = PeekL(*ptr) ; On lit l'adresse du prochain élément
Until *ptr = 0 ; Si elle est nulle, on sort de la boucle
EndIf
EndProcedure