Page 1 sur 2
Structure et pointeur
Publié : mar. 28/sept./2004 21:04
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

Publié : mar. 28/sept./2004 21:23
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!
Publié : mar. 28/sept./2004 21:34
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)
Publié : mar. 28/sept./2004 21:47
par nico
Oui mais si je l'écrit de cette façon, j'ai toujours une erreur!
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

Publié : mar. 28/sept./2004 21:48
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:
Ce code ne provoque pas d'erreur
Celui-ci en provoque une.
---------------------------
PureBasic
---------------------------
Ligne3: Can't do it, else endless recursivity
---------------------------
OK
---------------------------
Publié : mar. 28/sept./2004 21:53
par Chris
Question idiote, mais... pourquoi tu veux créer une liste chainée maison?
Publié : mar. 28/sept./2004 22:19
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!

Publié : mar. 28/sept./2004 23:50
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
Publié : mer. 29/sept./2004 0:54
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))
Publié : mer. 29/sept./2004 19:36
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))
Publié : jeu. 30/sept./2004 14:36
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).
Publié : jeu. 30/sept./2004 16:37
par nico
Ahhhh merci pour ta réponse Fred, ouf je peux arrêter de chercher l'erreur
@Chris, tu avais donné la solution, mais ça me paraissait pas du tout correct, j'aurais du t'écouter!

Publié : jeu. 30/sept./2004 17:50
par Chris
Je suis génial sans le savoir
On y peut rien, c'est comme ça

Publié : jeu. 30/sept./2004 19:16
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
Publié : jeu. 30/sept./2004 21:51
par Le Soldat Inconnu
va falloir que je regarde ça car les pointeurs, j'ai pas tout compris
