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

Code : Tout sélectionner

Protected *this._struct = AllocateStructure(_struct)
Et non pas

Code : Tout sélectionner

AllocateMemory(SizeOf(_classe))
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

Code : Tout sélectionner

Protected *this._struct = AllocateStructure(_struct)
Et non pas

Code : Tout sélectionner

AllocateMemory(SizeOf(_classe))
Car avec AllocateMemory la structure ne pourra pas contenir de list
En fait j'ai pris la mauvaise habitude de faire un

Code : Tout sélectionner

allocatememory
et un

Code : Tout sélectionner

InitializeStructure
après. L'

Code : Tout sélectionner

allocatestructure
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 8O
Merci Kwandjeen 8)

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 8)
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 :D

Re: Purebasic et concepts de POO

Publié : mer. 08/août/2018 18:49
par Ollivier
falsam a écrit :
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
???
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 8)
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 :D
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.