Salut, esque quelqu'un sais si dans une Liste Chaînée l'adresse d'un élément change quand on suprime un autre élément situé avant cet élément?
Merci!
Question Listes Chaînées.
A priori non...
Code : Tout sélectionner
;{ Trousse de secours pour pointeurs d'éléments de liste / Ollivier }
Macro Each(VarName, ArrayName, Dimension = 0)
;Ollivier 9/8/7
PrivateLong90 = PeekL(@ArrayName#() - 8)
*PrivateLong91 = PeekL(@ArrayName#() - 12) + 4
If PeekL(*PrivateLong91) = 0
PrivateLong92 = PrivateLong90
Else
PrivateLong92 = 1
PrivateLong93 = 1
PrivateLong94 = 0
For PrivateLong96 = 0 To Dimension
PrivateLong95 = PrivateLong94
PrivateLong94 = PeekL(*PrivateLong91)
PrivateLong92 = PrivateLong90 / PrivateLong94 / PrivateLong93
PrivateLong93 * PrivateLong92
If PrivateLong94 = PrivateLong95: PrivateLong92 = PrivateLong94: EndIf
*PrivateLong91 + 4
Next
EndIf
PrivateLongNine#VarName = PrivateLong92 - 1
For VarName = 0 To PrivateLongNine#VarName
EndMacro
Macro Map(Lst)
max.L = CountList(Lst)
Global Dim *Ptr(max - 1)
n.L = 0
ResetList(Lst)
While NextElement(Lst)
*Ptr(n) = @Lst
n + 1
Wend
EndMacro
Procedure EndMap()
Global Dim *Ptr(0)
EndProcedure
;}
; *********** PRINCIPE ************
NewList MyList.S()
AddElement(MyList() )
MyList() = "Yo!"
AddElement(MyList.S() )
MyList() = Space(1 << 27) ; Taille du 2ème élément : 128 MégaOctet
AddElement(MyList.S() )
MyList() = "Ni!"
Map(MyList() )
Each(i, *Ptr)
Debug "Adresse élément n°" + Str(i) + " : " + Str(*Ptr(i) )
Next
Debug "On supprime le 2ème élément qui fait 128Mo et ça donne:"
ChangeCurrentElement(MyList(), *Ptr(1) )
DeleteElement(MyList() )
Map(MyList() )
Each(i, *Ptr)
Debug "Adresse élément n°" + Str(i) + " : " + Str(*Ptr(i) )
Next
EndMap()
Dernière modification par Ollivier le mar. 28/août/2007 19:35, modifié 2 fois.
Code : Tout sélectionner
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SPH(2006)
; PB4
; LinkedList (c'est trop bien)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
InitSprite()
InitKeyboard()
;SetPriorityClass_ ( GetCurrentProcess_ (), #IDLE_PRIORITY_CLASS )
If ExamineDesktops() ; on examine la resolution du bureau
dw.w=DesktopWidth(0)
dh.w=DesktopHeight(0)
Else
dw.w=1024
dh.w=768
EndIf
OpenScreen(dw,dh,32,"") ; on ouvre un ecran de la resolution du bureau
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
Structure pixel
posx.w
posy.f
vitesse.f
couleur.l
EndStructure
NewList pixel.pixel() ; pour pas s'y perdre, vaux mieux donner le meme nom a la structure qu'a la liste
For i = 1 To 2000 ; on va "construire" 2000 etoiles
AddElement(pixel())
pixel()\posx = Random(dw-1)
pixel()\posy = -Random(dh) ; le - permet de les definir au dessus de notre ecran
p.f = (Random(400)+300)/100
pixel()\vitesse = p.f
u=40+Random(p*30)
pixel()\couleur = RGB(u,u,u)
Next
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
Repeat
ExamineKeyboard()
ClearScreen(0)
StartDrawing(ScreenOutput())
;********** A partir d'ici, tout est "LinkedList"
ForEach pixel.pixel() ; tant qu'il y a des etoiles on les affiches
With pixel()
\posy+\vitesse ; y=y+vitesse
If \posy>=dh-1 ; si une etoile va au dela de l'ecran,
DeleteElement(pixel()) ; on la tue
; c'est comme si, de "for i=1 to 100", on passait de "1 to 99" , etc,etc...
Else ; sinon
If \posy>=0 ; si elle est dans le cadre de notre ecran
Plot(\posx,\posy,\couleur) ; on l'affiche
EndIf
EndIf
EndWith
Next ; ce "foreach:next" s'addapte donc toujours au vrai nombre d'etoiles
;********** fin de la technique "LinkedList"
StopDrawing()
FlipBuffers(1)
;Delay(1)
Until KeyboardPushed(#PB_Key_All) Or CountList(pixel())=0
; if CountList(pixel())=0, on quitte
; "CountList(pixel())=0" veux dire : si la liste d'etoiles est vite
End
@meganet
Oups! Encore eut-il fallu bien se servir de ses petits outils de traitement. J'ai corrigé mon code pour qu'il vérifie correctement. A priori, même réponse. Map(Liste()) remet à jour chaque pointeur de la liste dans le tableau *Ptr().
@SPH
Une des joies de la programmation est de toujours en apprendre : With... EndWith, merci pour cette info
Oups! Encore eut-il fallu bien se servir de ses petits outils de traitement. J'ai corrigé mon code pour qu'il vérifie correctement. A priori, même réponse. Map(Liste()) remet à jour chaque pointeur de la liste dans le tableau *Ptr().
@SPH
Une des joies de la programmation est de toujours en apprendre : With... EndWith, merci pour cette info

Dernière modification par Ollivier le mar. 28/août/2007 19:45, modifié 1 fois.
Au cas où ça titillerait quelqu'un de savoir pourquoi je sors l'armada des macros et procédures, je lui répondrais
"Même inutilisé, un outil utile... reste utile!
Eut-il fallu se le garder?"
Non!
"Même inutilisé, un outil utile... reste utile!
Eut-il fallu se le garder?"
Non!