Purebasic et concepts de POO

Vous avez une idée pour améliorer ou modifier PureBasic ? N'hésitez pas à la proposer.
Fels
Messages : 12
Inscription : ven. 04/mai/2018 21:04

Purebasic et concepts de POO

Message 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.
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: Purebasic et concepts de POO

Message 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 ?
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Purebasic et concepts de POO

Message 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 ?
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Purebasic et concepts de POO

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Purebasic et concepts de POO

Message 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.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
kwandjeen
Messages : 204
Inscription : dim. 16/juil./2006 21:44

Re: Purebasic et concepts de POO

Message 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.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Purebasic et concepts de POO

Message 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)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Purebasic et concepts de POO

Message 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.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Purebasic et concepts de POO

Message 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
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Purebasic et concepts de POO

Message 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.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Purebasic et concepts de POO

Message 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 !!
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Purebasic et concepts de POO

Message 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()
  

G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Purebasic et concepts de POO

Message 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.
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Purebasic et concepts de POO

Message 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)

Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Purebasic et concepts de POO

Message par Ollivier »

@G-Rom

C'est bien, c'est beau, c'est propre. Il y a beaucoup de pédagogie.
Vraiment merci.
Répondre