Structure récursive & Hiérarchie

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Structure récursive & Hiérarchie

Message par microdevweb »

Shadow,

Tu peut jouer avec une procédure dite abstraite, ce qui revient à dire que chacun de tes niveaux appellera la procédure adéquate que tu renseigne à sa création

Code : Tout sélectionner

Prototype abstract(*this)
; Tous les gadgets sont des _content
Structure _content
  abstract.abstract ; procédure qui sera appellée en fonction du type
  List *myContents._content()
EndStructure

Structure _gad_1 Extends _content
  name.s
  ;etc
EndStructure

Structure _gad_2 Extends _content
  name.s
  ;etc
EndStructure

Structure _gad_3 Extends _content
  name.s
  ;etc
EndStructure

Global NewList *myGadget._content()
; procédure abstraite pour le gadget 1
Procedure make_gadget_1(*g._gad_1)
  Debug "MAKE GADGET 1 "+*g\name
  ForEach *g\myContents()
    *g\myContents()\abstract(*g\myContents())
  Next
EndProcedure
; procédure abstraite pour le gadget 2
Procedure make_gadget_2(*g._gad_2)
  Debug "MAKE GADGET 2 "+*g\name
  ForEach *g\myContents()
    *g\myContents()\abstract(*g\myContents())
  Next
EndProcedure
; procédure abstraite pour le gadget 3
Procedure make_gadget_3(*g._gad_3)
  Debug "MAKE GADGET 3 "+*g\name
  ForEach *g\myContents()
    *g\myContents()\abstract(*g\myContents())
  Next
EndProcedure
; ajoute un gadget de type 1
Procedure newGadget_1(name.s)
  AddElement(*myGadget())
  *myGadget() = AllocateStructure(_gad_1)
  *g._gad_1 = *myGadget()
  With *g
    \name = name
    \abstract = @make_gadget_1()
  EndWith
  ProcedureReturn *myGadget() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget de type 2
Procedure newGadget_2(name.s)
  AddElement(*myGadget())
  *myGadget() = AllocateStructure(_gad_2)
  *g._gad_2 = *myGadget()
  With *g
    \name = name
    \abstract = @make_gadget_2()
  EndWith
  ProcedureReturn *myGadget() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget de type 3
Procedure newGadget_3(name.s)
  AddElement(*myGadget())
  *myGadget() = AllocateStructure(_gad_3)
  *g._gad_3 = *myGadget()
  With *g
    \name = name
    \abstract = @make_gadget_3()
  EndWith
  ProcedureReturn *myGadget() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget enfant de type 1
Procedure addChidGadget_1(*parent._content,name.s)
  AddElement(*parent\myContents())
  *parent\myContents() = AllocateStructure(_gad_1)
  *g._gad_1 = *parent\myContents()
  With *g
    \name = name
    \abstract = @make_gadget_1()
  EndWith
  ProcedureReturn *parent\myContents() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget enfant de type 2
Procedure addChidGadget_2(*parent._content,name.s)
  AddElement(*parent\myContents())
  *parent\myContents() = AllocateStructure(_gad_2)
  *g._gad_2 = *parent\myContents()
  With *g
    \name = name
    \abstract = @make_gadget_2()
  EndWith
  ProcedureReturn *parent\myContents() ; on retourne le gadget ajouté
EndProcedure
; ajoute un gadget enfant de type 2
Procedure addChidGadget_3(*parent._content,name.s)
  AddElement(*parent\myContents())
  *parent\myContents() = AllocateStructure(_gad_3)
  *g._gad_3 = *parent\myContents()
  With *g
    \name = name
    \abstract = @make_gadget_3()
  EndWith
  ProcedureReturn *parent\myContents() ; on retourne le gadget ajouté
EndProcedure

; on ajoute au hasard des items
; j'ajoute un premier élement
Define *g = newGadget_1("ITEM 1")
; un enfant à l'item 1
addChidGadget_2(*g,"item 1 B")
; un enfant à l'item 1
Define *g = addChidGadget_3(*g,"item 1 C")
; un sous enfant à l'item 1 C
addChidGadget_2(*g,"item 1 C A")
; un sous enfant à l'item 1 C 
Define *g = addChidGadget_1(*g,"item C B")
; un sous sous enfant à l'item 1 C B
addChidGadget_2(*g,"item 1 C B A")
; un second item 
newGadget_2("ITEM 2")

; maintenant on teste un seule boucle est nécessaire
; les procédures abstraites font le reste du travail
ForEach *myGadget()
  *myGadget()\abstract(*myGadget())
Next

Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Structure récursive & Hiérarchie

Message par Ollivier »

G-Rom a écrit :puis après des références sur le jardinage en timelapse , des phrases énigmatiques , de la politique de comptoir , etc...
1) << référence sur le jardinage en timelapse >> : c'est de la récursivité.
2) << politique de comptoir >> : je n'ai pas la TV depuis 12 ans. Coïncidence que je constate par la presse écrite. Bien loin des actualités, sans récursivité, pas d'analyse de risque. C'est tout...
Avatar de l’utilisateur
Shadow
Messages : 1428
Inscription : mer. 04/nov./2015 17:39

Re: Structure récursive & Hiérarchie

Message par Shadow »

microdevweb,

Merci mais ce code est trop complexe à comprendre pour moi.
AMD Ryzen 5 3600 (6 cœurs / 12 threads, Socket AM4)
Gainward GeForce RTX 3070 (8 GB GDDR6)
ASUS PRIME A320M-K (chipset AMD A320)
64 GB DDR4-3200
Asus 24 Pouces: 1920 x 1080.
Système: Windows 10 64 Bits.

PureBasic: 6.30 beta 4 x64 Bits.
Répondre