Une liste chaînée dans une structure

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Une liste chaînée dans une structure

Message par Octavius »

Ce serait vraiment pratique de pouvoir organiser son code comme cela :

Code : Tout sélectionner

Structure Bidule
  Tel.w
  *Address
EndStructure

Structure Machin
  Name$
  Number.l
  NewList List.Bidule()
EndStructure

NewList Maliste.Machin()

AddElement(Maliste())
Maliste()\Name$="Truc"
Maliste()\Number=040488
  AddElement(Maliste()\List())
  Maliste()\List()\Tel=6534
  Maliste()\List()\Address=AllocateMemory(12)
  AddElement(Maliste()\List())
  Maliste()\List()\Tel=234
  Maliste()\List()\Address=AllocateMemory(7)
  ...
...
Malheureusement ce n'est pas possible... Avez-vous déjà été confrontés à ce problème ? Je cherche à créer un système équivalent mais ce n'est pas simple. Avez-vous des suggestions de code ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pourquoi ça ne te vas pas ça ?

Code : Tout sélectionner

Structure machin
    Name$
    Number.l
    Tel.l
   *Address
EndStructure
NewList Maliste.machin() 

CallDebugger

;-------- Add Elements and TestLists --------
;

AddElement(Maliste())
Maliste()\Name$="Truc"
Maliste()\Number=040488
Maliste()\Tel=6534
Maliste()\Address=AllocateMemory(12)
AddElement(Maliste())
Maliste()\Tel=234
Maliste()\Address=AllocateMemory(7) 


comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

faut les gérer soi même les listes dans les structures :
Je crois qu'il existe des codes à droite à gauche qui mettent tout ça en forme dans des procédures, mais bon ,là c'est un exemple :

Code : Tout sélectionner

Structure Bidule
  Tel.w
  *Address
  *Suivant.Bidule
EndStructure

Structure Machin
  Name$
  Number.l
  *List
EndStructure

NewList Maliste.Machin()
Define *Ptr.Bidule

AddElement(Maliste())
Maliste()\Name$="Truc"
Maliste()\Number=040488

Maliste()\List=AllocateMemory(SizeOf(Bidule))
*Ptr = Maliste()\List
*Ptr\Tel = 6534
*Ptr\Address=AllocateMemory(12)
*Ptr\Suivant=AllocateMemory(SizeOf(Bidule))
*Ptr = *Ptr\Suivant
*Ptr\Tel = 234
*Ptr\Address=AllocateMemory(7)
*Ptr\Suivant=#Null

ForEach Maliste()
  Debug Maliste()\Name$
  Debug Maliste()\Number
  *Ptr=Maliste()\List
  While *Ptr
    Debug *Ptr\Tel
    Debug MemorySize(*Ptr\Address)
    *Ptr=*Ptr\Suivant
  Wend  
Next
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Anonyme

Message par Anonyme »

la lib de Lionel_OM libVector2 le fait très bien.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

Merci pour tes explications comtois.

@ Cpl.Bator : Je ne trouve pas la lib dont tu parles, ni sur le forum ni sur google.

J'ai essayé de mettre au point des procédures toutes faites pour automatiser mes listes, mais c'est encore un peu compliqué pour moi... :?

Je cherche donc une lib, où mieux une lib ouverte où je peux voir le code avec ses commentaires, pour gérer ce genre de listes... Vous auriez des liens ? Même en anglais, je fais des progrès en ce moment :D
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

Ah cool merci! :D
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

Voici enfin le résultat de mon travail ! Evidemment c'est encore très tâtonnant comme code, auriez-vous des suggestions pour améliorer ça ?

Code : Tout sélectionner

;éléments d'une sous-liste chaînée
Structure Element
  *Next.Element
  *Previous.Element
EndStructure

;informations sur la sous-liste chaînée
Structure SubList
  Size.l ;taille de la structure de la liste chaînée
  Count.l ;nombre d'éléments
  Index.b ;index de l'élément courant
  *Current.Element ;adresse de l'élément courant
  *First.Element ;adresse du premier élément
  *Last.Element ;adresse du dernier élément
EndStructure

;sous-liste chaînée personnalisée
Structure Feature Extends Element
  Name$
EndStructure

;liste principale
Structure List
  Name$
  *Features.SubList
EndStructure

;********************************************************************

;Nouvelle sous-liste chaînée (avec un premier élément)
Macro NewSubList(Address,Structure)
  Address=AllocateMemory(SizeOf(SubList))
  Address\Size=SizeOf(Structure)
  Address\Count=0
  Address\Index=-1
  Address\Current=0
  Address\First=0
  Address\Last=0
EndMacro

;Ajout d'un nouvel élément à la sous-liste chaînée
Macro AddSubElement(Address)
  Address\Index=Address\Count
  Address\Count+1
  Address\Current=AllocateMemory(Address\Size)
  
  If Address\Index=0
    Address\First=Address\Current
  Else
    Address\Last\Next=Address\Current
    Address\Current\Previous=Address\Last
  EndIf
  
  Address\Last=Address\Current
EndMacro

;Accéder à l'élément courant
Macro SubElement(Address,Structure)
  *SubElement.Structure=Address\Current
  *SubElement
EndMacro
Macro ComSubElement(Address,Structure,Command)
  *SubElement.Structure=Address\Current
  Command *SubElement
EndMacro

;Renvoie le nombre d'éléments
Macro CountSubList(Address)
  Address\Count
EndMacro

;Renvoie l'index de l'élément courant
Macro SubListIndex(Address)
  Address\Index
EndMacro

;Sélection du premier élément
Macro FirstSubElement(Address)
  Address\Index=0
  Address\Current=Address\First
EndMacro

;Sélection de l'élément suivant
Macro NextSubElement(Address)
  If Address\Current\Next
    Address\Index+1
    Address\Current=Address\Current\Next
  EndIf
EndMacro

;Sélection de l'élément précédent
Macro PreviousSubElement(Address)
  If Address\Current\Previous
    Address\Index-1
    Address\Current=Address\Current\Previous
  EndIf
EndMacro

;********************************************************************

NewList List.List()

AddElement(List())
List()\Name$="Truc 0"

NewSubList(List()\Features,Feature) ;nouvelle sous-liste

AddSubElement(List()\Features) ;nouvel élément
SubElement(List()\Features,Feature)\Name$="Truc 0, sous-truc 0" ;valeur du nouvel élément

AddSubElement(List()\Features) ;nouvel élément
SubElement(List()\Features,Feature)\Name$="Truc 0, sous-truc 1" ;valeur du nouvel élément

AddSubElement(List()\Features) ;nouvel élément
SubElement(List()\Features,Feature)\Name$="Truc 0, sous-truc 2" ;valeur du nouvel élément

AddElement(List())
List()\Name$="Truc 1"

NewSubList(List()\Features,Feature) ;nouvelle sous-liste

AddSubElement(List()\Features) ;nouvel élément
SubElement(List()\Features,Feature)\Name$="Truc 1, sous-truc 0" ;valeur du nouvel élément

AddSubElement(List()\Features) ;nouvel élément
SubElement(List()\Features,Feature)\Name$="Truc 1, sous-truc 1" ;valeur du nouvel élément

AddSubElement(List()\Features) ;nouvel élément
SubElement(List()\Features,Feature)\Name$="Truc 1, sous-truc 2" ;valeur du nouvel élément

ForEach List()
  
  Debug List()\Name$
  
  FirstSubElement(List()\Features)
  For i=0 To CountSubList(List()\Features)-1
    ComSubElement(List()\Features,Feature,Debug)\Name$
    NextSubElement(List()\Features)
  Next i
  
Next
Répondre