Structure et pointeur

Programmation d'applications complexes
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Structure et pointeur

Message par nico »

Je ne comprends pas pourquoi il m'est interdit d'écrire la dernière de ces lignes qui constituent pourtant les bases de la création d'une liste chaînée faîte maison:

Code : Tout sélectionner

Structure liste
  nom.s
  *suivant.liste
EndStructure


*Debut.liste=AllocateMemory(SizeOf(liste))

*nouveau=AllocateMemory(SizeOf(liste))

*Debut\*suivant=*nouveau

:?:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Si tu fais *Debut\suivant=*nouveau, tu n'as plus de message d'erreur, mais est-ce que c'est correct, c'est une autre histoire!
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

oui car le * est purement décoratif, ça marche très bien sans (enfin moi je l'utilise jamais quand je gère de la mémoire)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Oui mais si je l'écrit de cette façon, j'ai toujours une erreur! :roll:

Code : Tout sélectionner

Structure liste 
  nom.s 
  suivant.liste 
EndStructure 


*Debut.liste=AllocateMemory(SizeOf(liste)) 

*nouveau=AllocateMemory(SizeOf(liste)) 

*Debut\suivant=*nouveau
Alors comment créer une liste chainée maison :?
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Le Soldat Inconnu a écrit :oui car le * est purement décoratif, ça marche très bien sans (enfin moi je l'utilise jamais quand je gère de la mémoire)
Pas d'accord:

Code : Tout sélectionner

Structure liste 
  nom.s 
  *suivant.liste 
EndStructure 
Ce code ne provoque pas d'erreur

Code : Tout sélectionner

Structure liste 
  nom.s 
  suivant.liste 
EndStructure 
Celui-ci en provoque une.
---------------------------
PureBasic
---------------------------
Ligne3: Can't do it, else endless recursivity

---------------------------
OK
---------------------------
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Question idiote, mais... pourquoi tu veux créer une liste chainée maison?
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Jusqu'à maintenant je ne comprenais pas ça:

Code : Tout sélectionner

Programmeurs expérimentés seulement: 
La valeur renvoyée par cette commande est un pointeur vers le nouvel élément. La structure de chaque élément est définie comme ceci: 
  Structure Element 
    *Next.Element        ; Pointeur vers l'élément suivant de la liste ou zéro si c'est le dernier élément 
    *Previous.Element    ; Pointeur vers l'élément précédent de la liste ou zéro si c'est le premier élément 

    ; La structure utilisée par la liste suit directement ces 2 variables (ce qui implique que les 
    ; données utilisateurs se situent à l'addresse du nouvel élément + 8 octets. 
  EndStructure 

Maintenant que j'en comprends le sens, j'aurais voulu le mettre en pratique avec un exemple maison!

:(
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Voilà comment j'aurais fais une liste chainée maison

Code : Tout sélectionner

Structure liste 
  nom.s 
  encours.l
  suivant.l
  precedent.l
EndStructure

; Premier element
Element1.liste
Element1\nom = "truc"
Element1\encours = @Element1

Element2.liste
Element2\nom = "bidule"
Element1\suivant = @Element2
Element2\precedent = @Element1
Element2\encours = @Element2

Element3.liste
Element3\nom = "chouette"
Element2\suivant = @Element3
Element3\precedent = @Element2
Element3\encours = @Element3


; on se place sur l'élément 1
CopyMemory(@Element1.liste, @Element.liste, SizeOf(liste))

; on affiche le texte
Debug Element\nom

; on se place sur l'élément 2
CopyMemory(Element\suivant, @Element.liste, SizeOf(liste))

; on affiche le texte
Debug Element\nom

; on change le texte de l'élément 2
Element\nom = "nouveau"
CopyMemory(@Element, Element\encours, SizeOf(liste))

; on se place sur l'élément 3
CopyMemory(Element\suivant, @Element.liste, SizeOf(liste))

; on affiche le texte
Debug Element\nom

; on se place sur l'élément 2
CopyMemory(Element\precedent, @Element.liste, SizeOf(liste))

; on affiche le texte
Debug Element\nom
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

@Soldat, je regarderais ton code plus en détail demain.

Quant à moi, j'ai pondu ça, on voit bien qu'à partir du premier pointeur que j'accède aux autres blocs mémoires, dont je peux lire ou modifier les données.

Code : Tout sélectionner

Structure liste 
  suivant.l
  nom.s 
EndStructure 

*nouveau1.liste=AllocateMemory(SizeOf(liste)) 
*nouveau1\nom="David"


*nouveau2.liste=AllocateMemory(SizeOf(liste))
*nouveau1\suivant=*nouveau2
*pointeur_courant.liste=*nouveau2
*pointeur_courant\nom="Nicolas"


*nouveau3.liste=AllocateMemory(SizeOf(liste))
*nouveau2\suivant=*nouveau3
*pointeur_courant.liste=*nouveau3
*pointeur_courant\nom="Laurent"


*nouveau4.liste=AllocateMemory(SizeOf(liste))
*nouveau3\suivant=*nouveau4
*pointeur_courant.liste=*nouveau4
*pointeur_courant\nom="Pierre"


*nouveau5.liste=AllocateMemory(SizeOf(liste))
*nouveau4\suivant=*nouveau5
*pointeur_courant.liste=*nouveau5
*pointeur_courant\nom="Paul"


Debug PeekS(PeekL(*nouveau1\suivant+4))
Debug PeekS(PeekL(PeekL(*nouveau1\suivant)+4))
Debug PeekS(PeekL(PeekL(PeekL(*nouveau1\suivant))+4))

Debug "--------------------"
;Changement de nom de Pierre par Pierrette
PokeS(PeekL(PeekL(PeekL(*nouveau1\suivant))+4),"Pierrette")
Debug PeekS(PeekL(PeekL(PeekL(*nouveau1\suivant))+4))
Debug "--------------------"

Debug PeekS(PeekL(PeekL(PeekL(PeekL(*nouveau1\suivant)))+4))
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Avec une structure:

Code : Tout sélectionner

Structure _LONG
  long.l 
EndStructure 


Structure liste 
  suivant.l
  nom.s 
EndStructure 

*debut.liste=AllocateMemory(SizeOf(liste)) 
*debut\nom="David" 
*pointeur._LONG=*debut

*nouveau.liste=AllocateMemory(SizeOf(liste)) 
*pointeur\long=*nouveau 
*nouveau\nom="Nicolas" 
*pointeur._LONG=*nouveau

*nouveau.liste=AllocateMemory(SizeOf(liste)) 
*pointeur\long=*nouveau
*nouveau\nom="Laurent" 
*pointeur._LONG=*nouveau

*nouveau.liste=AllocateMemory(SizeOf(liste)) 
*pointeur\long=*nouveau
*nouveau\nom="Paul" 
*pointeur._LONG=*nouveau


Debug *debut\nom

*pointeur._LONG=*debut
Debug PeekS(PeekL(*pointeur\long+4))

*pointeur._LONG=*pointeur\long
Debug PeekS(PeekL(*pointeur\long+4))

*pointeur._LONG=*pointeur\long
Debug PeekS(PeekL(*pointeur\long+4))
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

En fait c'est une sorte de bug du compilateur que j'hesite à changer. Il faut declarer le champs de ta structure avec l'etoile (pointeur) puis quand tu y accede, tu ne specifie pas l'étoile (comme dans le post de Chris).
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Ahhhh merci pour ta réponse Fred, ouf je peux arrêter de chercher l'erreur :D

@Chris, tu avais donné la solution, mais ça me paraissait pas du tout correct, j'aurais du t'écouter! :?
Dernière modification par nico le jeu. 30/sept./2004 19:10, modifié 1 fois.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Je suis génial sans le savoir

On y peut rien, c'est comme ça 8)
:lol:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Bon, avec l'explication de Fred, j'arrive enfin au résultat final.
Si je poste tous ces codes, c'est que je pense que c'est très instructif sur l'utilisation des pointeurs:

Code : Tout sélectionner

;Shéma d'une liste chaînée simple
;structure avec 1 seul pointeur pointant vers l'élément suivant

Structure liste 
  *suivant.liste 
  nom.s 
EndStructure 

*debut.liste=AllocateMemory(SizeOf(liste)) 
*debut\nom="David" 
*pointeur.liste=@*debut\suivant

*nouveau.liste=AllocateMemory(SizeOf(liste)) 
*pointeur\suivant=@*nouveau\suivant
*pointeur.liste=*nouveau
*pointeur\nom="Nicolas"

*nouveau.liste=AllocateMemory(SizeOf(liste)) 
*pointeur\suivant=@*nouveau\suivant
*pointeur.liste=*nouveau
*pointeur\nom="Paul"

*nouveau.liste=AllocateMemory(SizeOf(liste)) 
*pointeur\suivant=@*nouveau\suivant
*pointeur.liste=*nouveau
*pointeur\nom="Pierre"

*nouveau.liste=AllocateMemory(SizeOf(liste)) 
*pointeur\suivant=@*nouveau\suivant
*pointeur.liste=*nouveau
*pointeur\nom="Tony"


Debug *debut\nom

*pointeur1.liste=*debut\suivant
Debug *pointeur1\nom

*pointeur1.liste=*pointeur1\suivant
Debug *pointeur1\nom

*pointeur1.liste=*pointeur1\suivant
Debug *pointeur1\nom

*pointeur1.liste=*pointeur1\suivant
Debug *pointeur1\nom
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

va falloir que je regarde ça car les pointeurs, j'ai pas tout compris :roll:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre