Page 1 sur 5
Purebasic et concepts de POO
Publié : mer. 25/juil./2018 19:57
par Fels
Bonjour,
Dans une structure et si vous ajoutiez .p pour procedure. Cela ferait un pas de géant à purebasic tout en restant procedural.
Cordialment.
Abdel.
Re: Purebasic et concepts de POO
Publié : mer. 25/juil./2018 21:20
par kwandjeen
Code : Tout sélectionner
Interface MonObjet
Deplacer(x,y)
Detruire()
EndInterface
Structure _classe
*proc
x.i
y.i
EndStructure
Procedure CreationObjet()
Protected *this._classe
*this = AllocateMemory(SizeOf(_classe))
*this\x = 0
*this\y = 0
*this\proc = ?data_proc
ProcedureReturn *this
EndProcedure
Procedure Deplacer(*this._classe, x, y)
*this\x = x
*this\y = y
Debug "objet : " + Str(*this) +" -> position : " + x + " : " + y
EndProcedure
Procedure Detruire(*this.MonObjet)
FreeMemory(*this)
EndProcedure
Objet1.MonObjet = CreationObjet() ; un objet
Objet2.MonObjet = CreationObjet() ; un deuxième
Objet1\Deplacer(10, 20)
objet1\Deplacer(45,23)
Objet1\Detruire()
Objet2\Deplacer(20, 30)
Objet2\Detruire()
DataSection
data_proc:
Data.i @Deplacer()
Data.i @Detruire()
EndDataSection
Avec les interfaces peut-être ?
Re: Purebasic et concepts de POO
Publié : jeu. 26/juil./2018 8:08
par Kwai chang caine
Bonjour Kwandjeen
Cool ton code, j'ai presque compris
juste une question de newbies
Pour l'adresse des procédures on est obligé de passer par une datasection ?
Re: Purebasic et concepts de POO
Publié : jeu. 26/juil./2018 10:06
par falsam
Kwai chang caine a écrit :Pour l'adresse des procédures on est obligé de passer par une datasection ?
Oui
Tuto sur ce théme :
https://www.purebasic.fr/french/viewtop ... 21&t=15656
Re: Purebasic et concepts de POO
Publié : jeu. 26/juil./2018 11:36
par microdevweb
Note il vaut mieux utiliser
Et non pas
Car avec AllocateMemory la structure ne pourra pas contenir de list
Il est déjà très facile d'intégrer une procédure à une structure avec un pointeur
Code : Tout sélectionner
Procedure myProcedure()
Debug "hello"
EndProcedure
Structure _struct
*myProc
EndStructure
myStruct._struct\myProc = @myProcedure()
CallFunctionFast(myStruct\myProc)
Malheureusement pour que les interfaces fonctionnent il faut que toutes les procédures soit stockée dans un même pointeur.
Re: Purebasic et concepts de POO
Publié : jeu. 26/juil./2018 21:54
par kwandjeen
microdevweb a écrit :Note il vaut mieux utiliser
Et non pas
Car avec AllocateMemory la structure ne pourra pas contenir de list
En fait j'ai pris la mauvaise habitude de faire un
et un
après. L'
fait les 2 d'un coup.
Re: Purebasic et concepts de POO
Publié : sam. 28/juil./2018 7:26
par Kwai chang caine
@kwandjeen
Je me doutais un peu de la réponse, mais je voulais être sûr
Si c'est possible avec les datas c'est bizarre que fred n'est pas prévu la fonction @procedure() pour pouvoir capter le pointeur de procédure
Merci Kwandjeen

Re: Purebasic et concepts de POO
Publié : mar. 07/août/2018 20:48
par G-Rom
Fels a écrit :Bonjour,
Dans une structure et si vous ajoutiez .p pour procedure. Cela ferait un pas de géant à purebasic tout en restant procedural.
Cordialment.
Abdel.
Code : Tout sélectionner
PrototypeC Func()
Structure Foo
Func.Func
EndStructure
Procedure Any()
Debug #PB_Compiler_Procedure
EndProcedure
A.Foo
A\Func = @Any()
A\Func()
Bonjour, voila la manière de faire. l'inconvénient, c'est d'adresser manuellement la fonction après l'initialisation.
Re: Purebasic et concepts de POO
Publié : mer. 08/août/2018 8:11
par Kwai chang caine
Bonjour GRom
C'est pas simple et pas vraiment plus facile à comprendre

Mais ça a le mérite d’exister, je sais pas si c'est parce que c'est compliqué ou impossible pour FRED à faire, mais un simple retour comme en DataSection dans l'exemple de kwandjeen mais sans la DataSection, ça aurait été cool

Re: Purebasic et concepts de POO
Publié : mer. 08/août/2018 18:49
par Ollivier
???
Kwai chang caine a écrit :Pour l'adresse des procédures on est obligé de passer par une datasection ?
Non : on peut passer par un tableau, voire une zone mémoire.
Re: Purebasic et concepts de POO
Publié : mer. 08/août/2018 18:58
par falsam
Ollivier a écrit :Non : on peut passer par un tableau, voire une zone mémoire.
N'hésite pas à donner un code validant ce que tu viens de dire !!
Re: Purebasic et concepts de POO
Publié : mer. 08/août/2018 19:23
par G-Rom
Ollivier a écrit :Non : on peut passer par un tableau, voire une zone mémoire.
Code : Tout sélectionner
Global *Ptr = AllocateMemory(8)
Global Dim Tableau.i(2)
Interface MonObjet
Deplacer(x,y)
Detruire()
EndInterface
Structure _classe
*proc
x.i
y.i
EndStructure
Procedure CreationObjet()
Protected *this._classe
*this = AllocateMemory(SizeOf(_classe))
*this\x = 0
*this\y = 0
;*this\proc = @Tableau()
*this\proc = *Ptr
ProcedureReturn *this
EndProcedure
Procedure Deplacer(*this._classe, x, y)
*this\x = x
*this\y = y
Debug "objet : " + Str(*this) +" -> position : " + x + " : " + y
EndProcedure
Procedure Detruire(*this.MonObjet)
FreeMemory(*this)
EndProcedure
PokeI(*Ptr,@Deplacer())
PokeI(*Ptr+4,@Detruire()) ; +4 en x86 ! +8 en x64 !
Tableau(0) = @Deplacer()
Tableau(1) = @Detruire()
Objet1.MonObjet = CreationObjet() ; un objet
Objet2.MonObjet = CreationObjet() ; un deuxième
Objet1\Deplacer(10, 20)
objet1\Deplacer(45,23)
Objet1\Detruire()
Objet2\Deplacer(20, 30)
Objet2\Detruire()
Re: Purebasic et concepts de POO
Publié : mer. 08/août/2018 19:25
par G-Rom
Kwai chang caine a écrit :Bonjour GRom
C'est pas simple et pas vraiment plus facile à comprendre

Mais ça a le mérite d’exister, je sais pas si c'est parce que c'est compliqué ou impossible pour FRED à faire, mais un simple retour comme en DataSection dans l'exemple de kwandjeen mais sans la DataSection, ça aurait été cool

Bonjour KCC, c'est exactement la même chose que pour importé une lib. j'utilise des prototypes. c'est pas plus compliqué qu'autre chose.
Re: Purebasic et concepts de POO
Publié : mer. 08/août/2018 20:08
par falsam
En attendant que ce soit en natif, ma préférence est la déclaration des procédures en DataSection. Voir
https://www.purebasic.fr/french/viewtop ... 21&t=15656
Un exemple pour KCC en tenant compte du premier code de G-Rom
Code : Tout sélectionner
; Declaration d'un callback avec parametre
Prototype Callback(Parameter)
; Déclaration de la structure d'un rectangle
Structure NewRectangle
Longueur.i
largeur.i
perimetre.Callback
surface.Callback
EndStructure
; Les procédures uitilisées dans la struture
Procedure Perimetre(*this.NewRectangle)
ProcedureReturn (*this\Longueur + *this\Largeur) * 2
EndProcedure
Procedure Surface(*this.NewRectangle)
ProcedureReturn *this\Longueur * *this\Largeur
EndProcedure
; Et maintenant le test
Define Terrain.NewRectangle
With Terrain
\largeur = 10
\Longueur = 20
\perimetre = @Perimetre()
\surface = @Surface()
EndWith
; Resultat
Debug "Perimetre " + Terrain\perimetre(Terrain)
Debug "Surface " + Terrain\surface(Terrain)
Re: Purebasic et concepts de POO
Publié : mer. 08/août/2018 22:58
par Ollivier
@G-Rom
C'est bien, c'est beau, c'est propre. Il y a beaucoup de pédagogie.
Vraiment merci.