Probleme de pointeurs (liste chainée)
Publié : mar. 28/déc./2004 13:06
Bonjour a tous !!!
Je me suis amusé à voir comment marchés les pointeurs en Pure.
J'ai fait une structure Liste Chainée (Linkedlist) qui marche, mais le problème c'est qu'en modifiant le pointeur dans une fonction (Add, Delete ...) ne modifie pas le pointeur de l'objet dans le programme principal. Ainsi j'ai été obligé de faire ainsi :
Alors que je voudrais faire ceci :
Il n'y a aucune autre "fonctions" du style Shared, Global, ... qui ferait gardé la valeur de mon pointeur que j'ai modifié dans mes fonctions ???
Voici mon code :

Je me suis amusé à voir comment marchés les pointeurs en Pure.
J'ai fait une structure Liste Chainée (Linkedlist) qui marche, mais le problème c'est qu'en modifiant le pointeur dans une fonction (Add, Delete ...) ne modifie pas le pointeur de l'objet dans le programme principal. Ainsi j'ai été obligé de faire ainsi :

Code : Tout sélectionner
*liste.LinkedList
*liste = Add(*liste,5)
Code : Tout sélectionner
*liste.LinkedList
Add(*liste,5)

Voici mon code :
Code : Tout sélectionner
Structure Ennemi
Energ.w
EndStructure
Structure LinkedList
*Suiv.LinkedList
*Prec.LinkedList
Info.Ennemi
EndStructure
;- - - - - - - - - - Les fonctions - - - - - - - - - -
Procedure Add(*m1.LinkedList, s.w)
If *m1 = #Null
*m1 = AllocateMemory(SizeOf(LinkedList))
*m1\Info\Energ = s
ProcedureReturn (*m1)
EndIf
If (*m1\Suiv <> #Null)
Add(*m1\Suiv, s)
Else
*m2.LinkedList = AllocateMemory(SizeOf(LinkedList))
*m2\Prec = *m1
*m2\Info\Energ = s
*m2\Suiv = #Null
*m1\Suiv = *m2
EndIf
ProcedureReturn *m1
EndProcedure
Procedure Affiche(*m.LinkedList)
If *m <> #Null
PrintN(Str(*m\Info\Energ) + " " + Str(*m) + " " + Str(*m\Prec) + " " + Str(*m\Suiv))
Affiche(*m\Suiv)
EndIf
EndProcedure
Procedure.w Count(*m.LinkedList)
If *m <> #Null
ProcedureReturn(Count(*m\Suiv)+1)
EndIf
EndProcedure
Procedure Delete(*m.LinkedList, n.w)
Shared
If n<0 Or ( *m\Suiv = #Null And n>0)
PrintN("Erreur d'indice")
ProcedureReturn(*m)
EndIf
If n>0
Delete(*m\Suiv, n-1)
Else
If *m\Suiv <> #Null And *m\Prec <> #Null
PokeL(*m\Suiv+4, *m\Prec)
PokeL(*m\Prec, *m\Suiv)
FreeMemory(*m)
ElseIf *m\Suiv = #Null And *m\Prec = #Null ; Un seul élément
FreeMemory(*m)
*m = #Null
ElseIf *m\Suiv = #Null ;En fin de liste
PokeL(*m\Prec, #Null)
FreeMemory(*m)
Else ; En début de liste
PokeL(*m\Suiv+4, #Null)
*m = PeekL(*m)
FreeMemory(*m\Prec)
EndIf
EndIf
ProcedureReturn(*m)
EndProcedure
Procedure DeleteLast(*m.LinkedList)
If *m\Suiv <> #Null
DeleteLast(*m\Suiv)
Else
If *m\Prec = #Null ; Un seul élément
FreeMemory(*m)
*m = #Null
Else ;En fin de liste
PokeL(*m\Prec, #Null)
FreeMemory(*m)
EndIf
EndIf
ProcedureReturn(*m)
EndProcedure
;- - - - - - - - - - Programme principal - - - - - - - - - - - -
OpenConsole()
*mst.LinkedList = #Null
*mst = Add(*mst,5)
*mst = Add(*mst,6)
*mst = Add(*mst,7)
*mst = Add(*mst,3)
PrintN("nbr : " + Str(Count(*mst)))
PrintN("Affichage"): Affiche(*mst): PrintN("")
*mst = DeleteLast(*mst)
PrintN("Affichage"): Affiche(*mst): PrintN("")
*mst = DeleteLast(*mst)
PrintN("Affichage"): Affiche(*mst): PrintN("")
*mst = Delete(*mst, 0)
PrintN("Affichage"): Affiche(*mst): PrintN("")
*mst = DeleteLast(*mst)
PrintN("Affichage"): Affiche(*mst): PrintN("")
Input()