Structure récursive & Hiérarchie

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
microdevweb
Messages : 1800
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 : 4190
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...
Shadow
Messages : 1373
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.
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Répondre