Question Listes Chaînées.

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
meganet
Messages : 317
Inscription : jeu. 20/janv./2005 22:00

Question Listes Chaînées.

Message par meganet »

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!
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

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.
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

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 
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

@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 :D
Dernière modification par Ollivier le mar. 28/août/2007 19:45, modifié 1 fois.
Avatar de l’utilisateur
SPH
Messages : 4945
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Ollivier a écrit :@SPH

Une des joies de la programmation est de toujours en apprendre : With... EndWith, merci pour cette info :D
Pa2wak
meganet
Messages : 317
Inscription : jeu. 20/janv./2005 22:00

Merci.

Message par meganet »

Merci beaucoup!
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

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!
Répondre