Quelques questions...

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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 ;)
Image
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message par Joubarbe »

Oui mais je change bien quelque chose quand j'écris un PokeW() ? Je change la mémoire, non ?
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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:
Dernière modification par Flype le sam. 08/juil./2006 14:16, modifié 3 fois.
Image
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message 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 !
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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
Image
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message 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())
Anonyme

Message 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
Joubarbe
Messages : 93
Inscription : sam. 01/juil./2006 16:40

Message 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 :)
Répondre