Questions pointeurs

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
DarkIchigo
Messages : 62
Inscription : lun. 22/mars/2010 11:34

Questions pointeurs

Message par DarkIchigo »

Salut,

voila j'essaye d'avancer en PB mais je bloque aux pointeurs, j'ai lus les tutos et ce que j'ai pu trouvé dessus dans la doc
mais j'ai encore pas tout compris (pas grand chose même ^^ ) :

- Quelle est la différence entre *var et @var,
j'avoue être complètement perdu. Si une âme charitable pouvais m'aider (J'ai lu le tuto de Torp mais ne sachant pas la
différence entre *var et @var je ne comprends pas le reste du tuto) J'ai compris que @var = l'adresse mémoire de la variable,
mais *var, je sais pas qui c'est lui. Je penchais pour la valeur qui se trouve dans @var mais apparemment pas (ou alors
j'ai vraiemnt pas compris comment l'utiliser)

Encore désolé si mes questions sont débiles mais je suis encore au niveau débutant :)
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Questions pointeurs

Message par comtois »

*var est un pointeur, il contient une adresse

Code : Tout sélectionner

variable.i = 345
Debug variable

*var = @variable ; le pointeur *var contient l'adresse de variable
PokeI(*var, 321) ; on peut modifier le contenu de l'adresse 
Debug variable

;Autre méthode 
*ptr.Integer = @variable ; récupère l'adresse de variable
*ptr\i = 789 ; Modifie le contenu de l'adresse stockée dans *ptr
Debug variable
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
DarkIchigo
Messages : 62
Inscription : lun. 22/mars/2010 11:34

Re: Questions pointeurs

Message par DarkIchigo »

Merci comtois de la réponse, mais il reste encore qq chose que je ne sui pas certains d'avoir bien compris.
*var est une variable de type pointeur (tout comme var$ est une variable de type texte) jusque la j'ai bon?
@var sa valeur est toujours égale à l'adresse mémoire de la variable var ?

Donc pour pouvoir utiliser *var il faut déclarer *var = @var.
Mais dans ce cas ne serai-t-i pas plus simple de directement utiliser @var?

Pour reprendre ton code :

Code : Tout sélectionner

variable.i = 345
Debug variable

*variable = @variable
PokeI(*variable, 321)
Debug variable
et

Code : Tout sélectionner

variable.i = 345
Debug variable

PokeI(@variable, 321)
Debug variable
donnent exactement le même résultat.


Ou bien mon raisonnement / compréhension ne sont pas bons ?
Ou PE à haut niveau de programmation utiliser @var directement peut causer des problèmes?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Questions pointeurs

Message par comtois »

utiliser @var directement peut causer des problèmes
Non, c'est une adresse, tu peux l'utiliser dans toutes les commandes qui nécessitent une adresse. Donc aucun problème tu peux utiliser @var directement, mais c'est sans intérêt, autant modifier directement ta variable, var = 321;

L'intérêt d'un pointeur c'est de pouvoir créer une procédure unique qui pourra modifier n'importe quelle variable (ou zone mémoire à l'aide d'une structure).

Code : Tout sélectionner

variable.i = 345
toto.i= 765

Procedure test(*ptr)
  PokeI(*ptr, 321)
EndProcedure

test(@variable)
Debug variable
test(@toto)
Debug toto
Exemple avec une structure

Code : Tout sélectionner

Structure Vecteur3
  x.f
  y.f
  z.f
EndStructure

Define.Vecteur3 variable, toto
toto\x = 76.5
toto\y = 132
toto\z = 54.3

Procedure test(*ptr.Vecteur3)
  *ptr\x + 3
  *ptr\y + 3
  *ptr\z + 3
EndProcedure

test(@variable)
Debug variable\x
Debug variable\y
Debug variable\z
Debug "****"
test(@toto)
Debug toto\x
Debug toto\y
Debug toto\z
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
DarkIchigo
Messages : 62
Inscription : lun. 22/mars/2010 11:34

Re: Questions pointeurs

Message par DarkIchigo »

Ah merci je crois que je commence enfin a comprendre :)

en faite *var est bel et bien une variable de type pointeur mais qui n'a aucun lien avec var.
A la différence de @var qui sera toujours l'adresse mémoire de var.

en plus tu m'as aussi avancé un peu sur les structures :)

Par contre est-ce normal que ton 2eme code me donne comme résultat

Code : Tout sélectionner

3.0
3.0
3.0
****
79.5
135.0
57.29999923706055
au lieu de

Code : Tout sélectionner

3.0
3.0
****
79.5
135.0
57.3
?
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Re: Questions pointeurs

Message par comtois »

DarkIchigo a écrit :Ah merci je crois que je commence enfin a comprendre :)

en fait *var est bel et bien une variable de type pointeur mais qui n'a aucun lien avec var.
A la différence de @var qui sera toujours l'adresse mémoire de var.
Tu as tout compris. En fait c'est @ qui te permet d'obtenir une adresse. Tu peux utiliser @ pour connaitre l'adresse d'une fonction, d'un élément dans un tableau, etc

Code : Tout sélectionner

Dim Tableau.f(3)
*Ptr.Float = @Tableau(2)
*Ptr\f = 45.87

Debug Tableau(2)
Par contre est-ce normal que ton 2eme code me donne comme résultat
Oui, regarde la doc en bas de la page (Informations concernant les nombres flottants)
http://www.purebasic.com/french/documen ... ables.html
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
DarkIchigo
Messages : 62
Inscription : lun. 22/mars/2010 11:34

Re: Questions pointeurs

Message par DarkIchigo »

Ca y est ca commence à rentrer, merci !! :)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Questions pointeurs

Message par G-Rom »

c'est très simple :

Code : Tout sélectionner

CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
  #INTEGER_SIZE = 4  
CompilerEndIf

CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
  #INTEGER_SIZE = 8
CompilerEndIf


Dim Tableau.i(10)
Tableau(5) = 256
Adresse = @Tableau() + (5 * #INTEGER_SIZE)
Debug PeekI(Adresse)
@Tableau() Renvois l'adresse mémoire du tableau ( le debut du tableau donc )
(5 * #INTEGER_SIZE) c'est le décalage ( offset en anglais ) , on aurrais pu écrire @Tableau(5) directement , mais c'est pour l'exemple
#INTEGER_SIZE c'est la taille de la donné dans le tableau , ici c'est un tableau de .i ( 4 octets sur x86 , 8 sur x64 )

Adresse est donc égale au début du tableau , plus 5*4 (20) ou 5*8 (40) , soit à l'endroit ou le 256 est stocké.
la mémoire d'un tableau est contiguë tout comme une allocation de mémoire via AllocateMemory() , ce n'est pas le cas d'une liste ou d'une map.

je n'ai pas mis de * devant Adresse volontairement.
si ton tableau utilisait une structure , pour le calcul de l'offset , tu peut utilisé SizeOf() pour la structure , et OffsetOf() pour les champs interne a la structure.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Questions pointeurs

Message par Kwai chang caine »

je n'ai pas mis de * devant Adresse volontairement.
C'est dingue j'me posait la même question hier
Je crois savoir que le * permet de donner un format a la variable expliquant au compilateur que c'est un pointeur, mais a part ça ???
Peut on tout le temps utiliser un long simple sans * pour travailler avec les pointeurs ou parfois ça coince ?? :roll:
En un mot est ce que ecrire :

Code : Tout sélectionner

*Ptr = @a$
est pareil que

Code : Tout sélectionner

Ptr.l = @a$
si ce n'est l'histoire des 4 octets en X32 et 8 octetx en X64 ??

J'ai deja remarqué que pour passer à une procedure * etait obligatoire, car ça ..ça ne marche pas :(

Code : Tout sélectionner

Procedure test(ptr.Vecteur3)
  ptr\x + 3
  ptr\y + 3
  ptr\z + 3
EndProcedure

test(@variable)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre