Liste chainées, pointeurs et threads

Programmation d'applications complexes
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Liste chainées, pointeurs et threads

Message 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
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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 :)
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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 
Répondre