Pointeur équivalent dans Purebasic ?

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Pointeur équivalent dans Purebasic ?

Message par threedslider »

Hello,

C'est quoi le pointeur variable en programmation C en Purebasic équivalent ? Comme cela par exemple int *foo, et aussi pour l'argument de la fonction comme void foo(int *var1, int *var2) en Purebasic ?
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Pointeur équivalent dans Purebasic ?

Message par Ar-S »

Salut,
Tu as regardé dans la doc à "pointeur" ?

Code : Tout sélectionner

 Texte$ = "Bonjour"
  *Texte = @Texte$ ;*Texte a pour valeur l'adresse où réside la chaîne de caractères en mémoire
  *Pointeur.String = @*Texte ; *Pointeur pointe sur *Texte
  Debug *Pointeur\s ; Lit la chaîne de caractères qui réside à l'adresse écrite en *Pointeur (c-a-d @Texte$)

~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Re: Pointeur équivalent dans Purebasic ?

Message par threedslider »

Oui j'ai vu mais il y a pas on dirait le pointeur pour la variable native ? C'est à dire pour de type entier comme int *pVariable équivalent ? Là tu me montre en pointeur de caractère, est ce que ya pas pour type entier ?

Et si je fais ça :

Code : Tout sélectionner

myInt.i = 10

*PmyInt = @myInt

Debug *PmyInt
Cela me donne pas de bon résultat ... :?
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Pointeur équivalent dans Purebasic ?

Message par G-Rom »

threedslider a écrit : ven. 08/juil./2022 21:40 Oui j'ai vu mais il y a pas on dirait le pointeur pour la variable native ? C'est à dire pour de type entier comme int *pVariable équivalent ? Là tu me montre en pointeur de caractère, est ce que ya pas pour type entier ?

Et si je fais ça :

Code : Tout sélectionner

myInt.i = 10

*PmyInt = @myInt

Debug *PmyInt
Cela me donne pas de bon résultat ... :?
tu ne peux pas déréférencer un pointeur nu directement comme tu pourrais le faire en c , néanmoins tu peut le faire de 2 façons différentes :
par une structure , comme vu au dessus , ou avec les fcts peek...()

Code : Tout sélectionner

Structure Entier
  value.i  
EndStructure

myInt.i = 10

*PmyInt.Entier = @myInt
*PmyInt2       = @myInt

Debug *PmyInt\value
Debug PeekI(*PmyInt2)
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: Pointeur équivalent dans Purebasic ?

Message par Mesa »

En purebasic, un pointeur est une variable INTEGER qui contient une adresse mémoire et on ne s'occupe pas du typage.

Toutefois on a accès au type et à la variable pointée de la façon suivante:

Code : Tout sélectionner

; Define *ok.l 		; Erreur car un pointeur ne peut être q'un integer
Define.l *ok			; On crée un pointeur integer vers une variable long façon 1
Define.long *ptr	; On crée un pointeur façon 2
Define.l n				; Et un entier long "n"

n=10 				; A partir d'ici, on a n = 10  
*ptr = @n 	; *ptr contient maintenant l'adresse de la variable n  
*ptr\l + 5  ; On peut modifier directement la valeur de n  et n = 15
						

Debug n
Debug *ptr
Debug *ptr\l

Code : Tout sélectionner

Procedure SomeStuff (*Byref.Double)
		*Byref\d = 1.5
EndProcedure

Define.d T
SomeStuff(@T)
Debug StrD(T, 8)

Code : Tout sélectionner

Procedure.s Test(*Path)
	Protected *s.string = @*Path
	Debug *s\s
EndProcedure

file.s ="ABCD"
	
Debug Test(@file)

Code : Tout sélectionner

Global *newMemory
Procedure GetMemory(*MyMemory.Integer)
	*MyMemory\i = AllocateMemory(10000)
EndProcedure
Debug "*NewMemory BEFORE: " + Str(*newMemory)
GetMemory(@*newMemory)
Debug "*newMemory AFTER: " + Str(*newMemory)
If *newMemory
	FreeMemory(*NewMemory)
EndIf
M.
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Re: Pointeur équivalent dans Purebasic ?

Message par threedslider »

@G-Rom : Merci donc faut passer par structure... ça parait un peu compliquer lol

@Mesa : Décidément il y a encore de façon de faire les pointeurs, merci c'est noté.

sinon si je fais ça plus simple :

Code : Tout sélectionner

myInt.i = 10

*PmyInt = myInt

Debug *PmyInt
Je me disais : "Wtf" ça veut dit quoi sa ??? Pourtant il marche !!

Quelqu'un peut me dire si c'est bon comme programmation en Purebasic ?
Merci de votre retour.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Pointeur équivalent dans Purebasic ?

Message par G-Rom »

threedslider a écrit : sam. 09/juil./2022 13:59 @G-Rom : Merci donc faut passer par structure... ça parait un peu compliquer lol

@Mesa : Décidément il y a encore de façon de faire les pointeurs, merci c'est noté.

sinon si je fais ça plus simple :

Code : Tout sélectionner

myInt.i = 10

*PmyInt = myInt

Debug *PmyInt
Je me disais : "Wtf" ça veut dit quoi sa ??? Pourtant il marche !!

Quelqu'un peut me dire si c'est bon comme programmation en Purebasic ?
Merci de votre retour.
Bah non, ton pointeur n'as aucun intérêt , il ne pointe nul part sauf sur 10 ( qui n'est pas une adresse mémoire )



ex:

MaVariable.l = 255

*MonPointeur = @MaVariable

*MonPointeur CONTIENT l'adresse mémoire de MaVariable , pas le contenu, MAIS connaissant l'adresse , je peu lire donc le contenu avec les méthodes cité au dessus.

Lis un peu de doc sur le net avec les pointeurs est tu est bon.



edit :
Dim MonBeauTableau.w(99)


For i = 0 To 99
MonBeauTableau(i) = i * 10
Next


*pointeur = @MonBeauTableau(0)


Debug "Adresse mémoire du Tableau : " + Str(*pointeur)


; modification de l'index 50 sans passé par le tableau de base ( x2 car c'est un word )
PokeW( *pointeur + ( 50 * 2), 33)


For j = 0 To 99
Debug "Lecture de l'index : " + Str(j) + " = " + Str(PeekW(*pointeur + (j * 2)))
Next
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Re: Pointeur équivalent dans Purebasic ?

Message par threedslider »

@G-Rom : Merci beaucoup pour ta clarté :D ... OK basé sur un livre de l'algorithme en programmation C, j'ai adapté en Purebasic pour faire un arbre en ligne segment en récursif, voici le code qui marche pas trop car je ne sais pas si c'est lié au pointeur ou à la fonction Random() ou les deux ! :

Code : Tout sélectionner

; Based on book : Algorithmes et structures de données by Michel Divay (C programming)
; Coded and adapted by threedslider 09.07.2022

Structure Pos_AB
  NX.i
  NY.i
EndStructure

Procedure Avance(L.i, X.i, Y.i, Angle.i, *pointer.Pos_AB)
  i.i = 0
 
  *pointer\NX = X + Int(L * Cos (Angle*2*PI / 360.0))
  
  *pointer\NY = Y - Int(L * Sin (Angle*2*PI / 360.0))
  
 
  Len = L/15
  
  
  For i=0 To Len
    LineXY(X+i, Y, *pointer\NX+i, *pointer\NY, RGB(255,0,0)) 
  Next
  
EndProcedure

Procedure Arbres(H.i, X.i, Y.i, Angle.i)
  Define.Pos_AB variable_AB
  variable_AB\NX = 0
  variable_AB\NY = 0
  N.i 
  I.i
  Dev.i
  rr1.i = Random(H)
  Rad.i = rr1 % H
  
  H = Int(H + 0.1 * rr1)
    
  Avance(H, X, Y, Angle, @variable_AB)
  H = 2*H / 3
    
  If H > 1
    rr2.i = Random(H)
    N = rr2 + 2
    Dev = 180/N
    For I = 1 To N
        Arbres(H, variable_AB\NX, variable_AB\NY, Angle - 90 - Dev/2 + I*Dev)
    Next
  EndIf       
EndProcedure

If OpenWindow(0, 0, 0, 600, 600, "Tree lines in recursive", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateImage(0, 600, 600) And StartDrawing(ImageOutput(0))
      
      Arbres(10,300,400,90) 
           
      StopDrawing() 
      ImageGadget(0, 0, 0, 200, 200, ImageID(0))
    EndIf
    
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
EndIf
Sachant que j'ai remplacé les pointeurs int *NX et int *NY par la structure Pos_AB pour faire le pointeur comme *pointer.Pos_AB puis le random() je crois que cela marche pas trop car en programmation C je fais l'équivalent pour H = int (H + 0.1 * (rand() % H)); en rr1. = Random(H) et H = Int(H + 0.1 * rr1), ensuite je fais le en C pour N = rand() % 3 + 2; en rr2.I = Random(H) et N = rr2 + 2 mais je ne sais pas si c'est bon comme équivalent, que me conseilles tu ?

Sinon le reste le code est conforme au C pour Purebasic.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Pointeur équivalent dans Purebasic ?

Message par G-Rom »

Pour l'utilisation des pointeurs , tu est bon, pour le reste , il faudrait voir le code d'origine et que tu fasses un nouveau topic.
Pour aller plus loin :

Code : Tout sélectionner

NombreDeWord.l = 55


*Memory = AllocateMemory( NombreDeWord * SizeOf(Word) ) ; on alloue de la mémoire CONTIGÜE



; On stocke ce que l'on veut dedans : 

; Au debut de la mémoire on écrit 2542 dans un LONG
PokeL(*Memory ,2542)

; On stock la valeur de pi après le LONG
PokeF(*Memory + SizeOf(Long) , #PI ) 

; Du texte
PokeS(*Memory + SizeOf(Long) + SizeOf(Float) , "Hello memory!")

;un double
PokeD(*Memory + SizeOf(Long) + SizeOf(Float) + (StringByteLength("Hello memory!")+2), 9.64532145)


; la mémoire ressemble à cela : 
 
; [INT][FLOAT][     TEXTE     ][   DOUBLE    ].......................................... 
; ↑ 
; *Memory



; la lecture 

Debug PeekL(*Memory)
Debug PeekF(*Memory + SizeOf(Long))
Debug PeekS(*Memory + SizeOf(Long) + SizeOf(Float) )
Debug PeekD(*Memory + SizeOf(Long) + SizeOf(Float)  + (StringByteLength("Hello memory!")+2) )
L'art des pointeurs et de la mémoire est de savoir ce déplacer dedans , sans en sortir sous risque de bug aléatoire , et de ne pas oublier de libérer tout pointeur alloué manuellement, le petit snippet à juste un but pédagogique pour comprendre le pointeur et l'offset ( le déplacement )
Avatar de l’utilisateur
threedslider
Messages : 455
Inscription : dim. 01/juil./2018 22:38

Re: Pointeur équivalent dans Purebasic ?

Message par threedslider »

Merci beaucoup à G-Rom, Ar-S et Mesa pour les exemples, j'ai corrigé finalement et il marche ! :D
Ok je vais poster un nouveau topique pour la correction et j'ai oublié de préciser le PI par #PI voilà maintenant c'est nickel 8)

Je suis impressionné par le potentiel de Purebasic, il est vraiment puissant !
Répondre