Page 1 sur 1
Une liste chaînée dans une structure
Publié : sam. 05/juil./2008 16:54
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 ?
Publié : sam. 05/juil./2008 17:50
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)
Publié : dim. 06/juil./2008 10:12
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
Publié : dim. 06/juil./2008 11:29
par Anonyme
la lib de Lionel_OM libVector2 le fait très bien.
Publié : dim. 06/juil./2008 21:16
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

Publié : dim. 06/juil./2008 22:16
par Anonyme
Publié : dim. 06/juil./2008 22:21
par Octavius
Ah cool merci!

Publié : mar. 15/juil./2008 15:05
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