Page 1 sur 1
Pointeur équivalent dans Purebasic ?
Publié : ven. 08/juil./2022 12:58
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 ?
Re: Pointeur équivalent dans Purebasic ?
Publié : ven. 08/juil./2022 13:13
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$)
Re: Pointeur équivalent dans Purebasic ?
Publié : ven. 08/juil./2022 21:40
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 :
Cela me donne pas de bon résultat ...

Re: Pointeur équivalent dans Purebasic ?
Publié : ven. 08/juil./2022 22:31
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 :
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)
Re: Pointeur équivalent dans Purebasic ?
Publié : sam. 09/juil./2022 9:17
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.
Re: Pointeur équivalent dans Purebasic ?
Publié : sam. 09/juil./2022 13:59
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 :
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.
Re: Pointeur équivalent dans Purebasic ?
Publié : sam. 09/juil./2022 18:02
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 :
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
Re: Pointeur équivalent dans Purebasic ?
Publié : sam. 09/juil./2022 21:04
par threedslider
@G-Rom : Merci beaucoup pour ta clarté

... 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.
Re: Pointeur équivalent dans Purebasic ?
Publié : sam. 09/juil./2022 23:19
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 )
Re: Pointeur équivalent dans Purebasic ?
Publié : dim. 10/juil./2022 11:34
par threedslider
Merci beaucoup à G-Rom, Ar-S et Mesa pour les exemples, j'ai corrigé finalement et il marche !
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
Je suis impressionné par le potentiel de Purebasic, il est vraiment puissant !