Page 4 sur 4

Publié : sam. 08/juil./2006 13:45
par Flype
J'utilise un pointeur plutôt qu'une variable car seul le pointeur est apte à manipuler la mémoire ?

pas forcément, mais disons que oui pour simplifier les choses.

J'utilise un PokeW pour écrire sur un Word mais comment fais-je pour écrire à nouveau sur *MemoryID alors qu'il vaut maintenant 1200 ?

non, *MemoryID garde la même valeur, elle n'est pas changé par un Poke().
Elle le serait en faisant tout simplement *MemoryID = 12. Or ici, il faut que tu comprenne que *MemoryID est une boite dans laquelle on stocke la valuer 12.

Et enfin, le pointeur est en fait surtout (seulement ?) utile pour manipuler la mémoire.. ?

Oui. Mais manipuler la mémoire est un sport qu'on excerce en permanence quand on programme ;)

Publié : sam. 08/juil./2006 13:50
par Joubarbe
Oui mais je change bien quelque chose quand j'écris un PokeW() ? Je change la mémoire, non ?

Publié : sam. 08/juil./2006 14:04
par Flype
c'est normal que tu bloques un peu là dessus.
tout le monde a bloqué un jour sur cette subtilité que sont les pointeurs.

alors je vais te raconter l'histoire différemment,

imagine que *MemoryID est l'adresse postale de chez toi.

Quelqu'un t'envoi gentillement une carte postale qui contient le chiffre 12.

Le facteur dépose (Poke) la carte postale (12) dans la boite au lettre (*MemoryID).

La boite aux lettres n'a pas bougée. Elle toujours là, au même endroit.
Heureusement, sinon le facteur ne saurait plus où poster son courrier (Poke), et toi tu ne saurais plus où relever ton courrier (Peek).

Maintenant, au petit matin tu ouvres ta boite aux lettres (Peek) et tu y découvres ta jolie carte postale (12).

Imagine maintenant que tes 512Mo de mémoire vive, réprésentent ( 512 * 1024 * 1024 ) boites aux lettres différentes d'octets (Byte ou .b)
Autant dire que çà représente une très grande ville et que le facteur a baucoup de travail qui l'attends... Mais heureusement, ton quartier se limitera à quelques boites aux lettres seulement.

:wink:

Publié : sam. 08/juil./2006 14:07
par Joubarbe
Ouki merci, j'aime ce genre d'exemple :) On comprend mieux. Reste à savoir quand et pourquoi les utiliser, mais je verrai ça plus tard !

Publié : sam. 08/juil./2006 14:09
par Flype
on les utilise dans des cas très variés.

un autre example :

Code : Tout sélectionner

Structure PERSONNE
  prenom.s
  nom.s
  age.b
  taille.l
EndStructure


; 1.
; ici, purebasic alloue la mémoire nécessaire pour nous.
; quand on manipule les champs de notre structure,
; on manipule en fait la mémoire sans le savoir.

moi.PERSONNE
moi\prenom = "donald"
moi\nom    = "duck"
moi\age    = 29
moi\taille = 152

Debug moi\prenom
Debug moi\nom
Debug moi\age
Debug moi\taille


; 2.
; ici, on accède à la structure directement avec un pointeur
; grace à '@' on récupère l'adresse de la structure 'moi' créée ci dessus.

*moiAddr.PERSONNE = @moi

Debug *moiAddr\prenom
Debug *moiAddr\nom
Debug *moiAddr\age
Debug *moiAddr\taille


; 3.
; ici, on alloue nous-même la mémoire nécessaire
; pour manipuler tous les champs de notre structure

*moi.PERSONNE = AllocateMemory(SizeOf(PERSONNE))

If *moi <> #Null
  
  *moi\prenom = "donald"
  *moi\nom    = "duck"
  *moi\age    = 29
  *moi\taille = 152
  
  Debug *moi\prenom
  Debug *moi\nom
  Debug *moi\age
  Debug *moi\taille
  
  FreeMemory(*moi)
  
EndIf

Publié : dim. 09/juil./2006 21:28
par Joubarbe
Une nouvelle question.

Dans le code (très mal écrit j'en conviens) :

Code : Tout sélectionner

If InitSprite() = 0 Or InitMouse() = 0 Or InitKeyboard() = 0 Or OpenScreen(1024,768,32,"AppTitle") = 0
  MessageRequester("Erreur !", "Erreur d'initialisation !", #PB_MessageRequester_Ok)
  End
EndIf

Mouse = LoadSprite(#PB_Any,"Curseur.bmp")
TransparentSpriteColor(Mouse,RGB(255,0,255))
X=300
Y=200
Repeat
  ClearScreen(RGB(0,0,0))  
  DisplayTransparentSprite(Mouse,X,Y)
  
  ExamineMouse()
  If MouseDeltaX() > 0
    X = MouseX()+20
  EndIf
  If MouseDeltaY() > 0
    Y = MouseY()+20
  EndIf
  If MouseDeltaX() < 0
    X = MouseX()-20
  EndIf
  If MouseDeltaY() < 0
    Y = MouseY()-20
  EndIf
  
  FlipBuffers()
  ExamineKeyboard()
Until KeyboardReleased(#PB_Any)


End
Ma souris fait un mouvement bizarre, elle n'est pas fluide. J'avais fait l'erreur de mettre X = X +20 c'était pire ; sans que je ne sache trop pourquoi, PB préfère X = MouseX() + 20 ; mais c'est toujours pas ça... Une petite aide ? :oops:

EDIT : J'ai ajotué ça mais en vain...

Code : Tout sélectionner

If MouseDeltaX() = 0 And MouseDeltaY() = 0
    X = MouseX()
    Y = MouseY()
  EndIf
EDIT2 : Ah mais vouiiiiii !

Code : Tout sélectionner

DisplayTransparentSprite(Mouse,X,Y)
A remplacer par :

Code : Tout sélectionner

DisplayTransparentSprite(Mouse,MouseX(),MouseY())

Publié : lun. 10/juil./2006 10:50
par Anonyme
Tu sais que tu as le droit de faire des nouveaux post :wink:
car dans un an il va être long celui là :D

Publié : lun. 10/juil./2006 12:03
par Joubarbe
Héhé, oui je m'y attendais à celle là :) Mais bon, j'exagère pas mal avec mes questions, j'évite de polluer le forum...

J'essaierai de faire un effort :)