Malheureusement , c'est un manque dans purebasic , mais heureusement qu'il existe les pointeurs pour s'en sortir.Structure MaStruct
Newlist MaListe()
MaVariable.l
etc.c
...
endstructure
voici du code qui simplifie énormément la tâche :
LISTE DES COMMANDES :
SOURCE :*MaListe.Array = NewArray()
Création d'une nouvelle liste , *MaListe.Array peut être au sein d'une structure , mais la macro NewArray() doit être appeler obligatoirment !
PrevArrayElement(*A.Array)
Sélectionne l'élément précédent , pas de risque de dépassement.
NextArrayElement(*A.Array)
Sélectionne l'élément suivant , pas de risque de dépassement.
FirstArrayElement(*A.Array)
Sélectionne le 1° élément de la liste
LastArrayElement(*A.Array)
Sélectionne le dernier élément de la liste
AddArrayElement(*A.Array,Element.l)
Ajoute un élément à la fin de la liste
SelectArrayElement(*A.Array,Index.l)
Sélectionne l'élément par son emplacement dans la liste (index)
DeleteArrayElement(*A.Array,DeleteObject=#False)
Efface un élément de la liste , si DeleteObject = #true , l'objet contenu est aussi effacé.
SwapArrayElement(*A.Array,IndexA,IndexB)
Inverse 2 éléments.
GetCurrentArrayPtr(*A.Array)
Renvois l'élément selectionné
DebugArrayList(*A.Array)
Affiche la liste via la fenetre de debug.
Code : Tout sélectionner
;#---------------------------------------------------------------------
;# LISTE DOUBLEMENT CHAINEE DYNAMIQUE
;# PUREBASIC 4.2 LINUXx86 Ubuntu
;#
;# PAR CPL.BATOR
;#---------------------------------------------------------------------
Structure ArrayNode
*Left
*Right
Ptr.l
EndStructure
Structure Array
*List.ArrayNode ;First element
NbElement.l
EndStructure
Macro NewNode()
AllocateMemory(SizeOf(ArrayNode))
EndMacro
Macro NewArray()
AllocateMemory(SizeOf(Array))
EndMacro
;----------------------------------------------------------------------------------------------------------
;
;----------------------------------------------------------------------------------------------------------
Procedure PrevArrayElement(*A.Array)
With *A
If \list\left<>-1
\list=\list\left
ProcedureReturn 1
ElseIf \list\left=-1
ProcedureReturn -1
EndIf
EndWith
EndProcedure
;----------------------------------------------------------------------------------------------------------
;
;----------------------------------------------------------------------------------------------------------
Procedure NextArrayElement(*A.Array)
With *A
If \list\right<>-1
\list=\list\right
ProcedureReturn 1
ElseIf \list\right=-1
ProcedureReturn -1
EndIf
EndWith
EndProcedure
;----------------------------------------------------------------------------------------------------------
;
;----------------------------------------------------------------------------------------------------------
Procedure FirstArrayElement(*A.Array)
While Q<>-1
Q=PrevArrayElement(*A)
Wend
*A\list=*A\list\right
EndProcedure
;----------------------------------------------------------------------------------------------------------
;
;----------------------------------------------------------------------------------------------------------
Procedure LastArrayElement(*A.Array)
While Q<>-1
Q=NextArrayElement(*A)
Wend
EndProcedure
;----------------------------------------------------------------------------------------------------------
;
;----------------------------------------------------------------------------------------------------------
Procedure AddArrayElement(*A.Array,Element.l)
With *A
If \NbElement=0
\list = NewNode()
\list\Ptr=-1
\list\left=-1
Else
LastArrayElement(*A)
EndIf
;On alloue le prochain �l�ment
\List\Right = NewNode()
*NE.ArrayNode=\List\Right
*NE\Right=-1
*NE\Ptr=Element
*NE\left=\list
\list=*NE
\NbElement+1
EndWith
EndProcedure
;----------------------------------------------------------------------------------------------------------
;
;----------------------------------------------------------------------------------------------------------
Procedure SelectArrayElement(*A.Array,Index.l)
FirstArrayElement(*A)
For i = 0 To Index-2
NextArrayElement(*A)
Next
EndProcedure
;----------------------------------------------------------------------------------------------------------
;
;----------------------------------------------------------------------------------------------------------
Procedure DeleteArrayElement(*A.Array,DeleteObject=#False)
*R.ArrayNode = *A\List\Right
*L.ArrayNode = *A\List\Left
;on fait la jonctions des membres lat�raux
If *A\List\Right<>-1:*R\Left=*L:EndIf
If *A\List\Left<>-1:*L\Right=*R:EndIf
Left=*A\List\Left
If DeleteObject=#True
FreeMemory(*A\List\Ptr)
EndIf
FreeMemory(*A\List)
*A\List =Left
EndProcedure
;----------------------------------------------------------------------------------------------------------
;
;----------------------------------------------------------------------------------------------------------
Procedure SwapArrayElement(*A.Array,IndexA,IndexB)
SelectArrayElement(*A,IndexA)
*LA.ArrayNode=*A\List
SelectArrayElement(*A,IndexB)
*LB.ArrayNode=*A\List
Swap *LA\ptr,*LB\ptr
EndProcedure
;----------------------------------------------------------------------------------------------------------
;
;----------------------------------------------------------------------------------------------------------
Procedure.l GetCurrentArrayPtr(*A.Array)
ProcedureReturn *A\List\Ptr
EndProcedure
;----------------------------------------------------------------------------------------------------------
;
;----------------------------------------------------------------------------------------------------------
Procedure DebugArrayList(*A.Array)
FirstArrayElement(*A)
Debug ""
Debug "##############"
Debug "#DEBUT DE LA LISTE #"
Debug "##############"
Debug ""
While Q<>-1
Debug "ELEMENT PRECEDENT = "+Str(*A\List\Left) + " ELEMENT COURANT = "+Str(*A\List)+ " ELEMENT SUIVANT = "+Str(*A\List\Right)+" Valeur pointeur :: "+Str(*A\List\Ptr)
Q=NextArrayElement(*A)
Wend
Debug ""
Debug "############"
Debug "#FIN DE LA LISTE #"
Debug "############"
Debug ""
EndProcedure
;----------------------------------------------------------------------------------------------------------
;
;----------------------------------------------------------------------------------------------------------
EXEMPLE :
Voici l'exemple ou un Heros possède une liste d'objet , il peut y avoir plusieurs heros , plusieurs objets...
dans l'exemple un seul heros avec 3 objets.
Code : Tout sélectionner
;voici une liste d'objet possible.
;C'est pas la meilleur façon de faire , mais c'est pour illustrer
; l'utilisation des Array's
; Donc, 3 objet , une epee , du jaune , un flingue...
Structure OBJET
Nom$
Vie.f
EndStructure
Sabre.Objet
Sabre\Nom$="Epee de la mort qui tue..."
Sabre\Vie=0.5
Potion.Objet
Potion\Nom$="Pastis51"
Potion\Vie=250
Pistolet.Objet
Pistolet\Nom$="Magnum357"
Pistolet\Vie=125.8
;Notre Hero possède une liste d'objet
Structure HERO
*ListeObjet.Array
EndStructure
; Bernard est notre heros
BERNARD.HERO
;On initialise la liste de la structure HERO
BERNARD\ListeObjet = NewArray()
; On lui donne un flingue
AddArrayElement(BERNARD\ListeObjet,@Pistolet) ; On passe le pointeur de Pistolet dans la liste
; On lui donne deux jaunes , il aime bien la tisane ,c'est une gueule à fioul notre Bernard...
AddArrayElement(BERNARD\ListeObjet,@Potion) ; idem,on passe le pointeur
AddArrayElement(BERNARD\ListeObjet,@Potion)
; Et une épée...
AddArrayElement(BERNARD\ListeObjet,@Sabre)
; Voila bernard est équipé , je veut connaitre la vie du 4° élément maintenant
SelectArrayElement(BERNARD\ListeObjet,4) ; on selectionne donc le 2� �l�ment
*OBJET_TEMPORAIRE.OBJET = GetCurrentArrayPtr(BERNARD\ListeObjet); Notre objet Temporaire est en quelque sorte une r�f�rence de l'objet.
Debug "VIE DU 4° ELEMENT : "+StrF(*OBJET_TEMPORAIRE\Vie)
Debug "NOM DU 4° ELEMENT= "+*OBJET_TEMPORAIRE\Nom$
;Il n'a pas besoin d'une épée , on la vire... , meme dans le jeu elle ne sert pas , je supprime aussi l'objet en plus de l'element
LastArrayElement(BERNARD\ListeObjet)
DeleteArrayElement(BERNARD\ListeObjet) ; Sabre.Objet n'est donc plus valide !!!!
Debug ""
Debug ""
Debug ""
;on résume la liste a nanar
Debug "LISTE DOBJET A BERNARD"
FirstArrayElement(BERNARD\ListeObjet)
Debug ""
While NextE<>-1
c+1
Debug "ITEM N°"+Str(c)
*OBJET_TEMPORAIRE.OBJET = GetCurrentArrayPtr(BERNARD\ListeObjet)
Debug "NOM=="+*OBJET_TEMPORAIRE\Nom$
Debug "VIE=="+StrF(*OBJET_TEMPORAIRE\Vie)
NextE=NextArrayElement(BERNARD\ListeObjet)
Debug ""
Debug ""
Wend