Tableaux : Macro Each() - Procedure Burst()

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Tableaux : Macro Each() - Procedure Burst()

Message par Ollivier »

Voici une macro qui a la même fonction que ForEach mais pour les tableaux.

Code : Tout sélectionner

Macro Each(VarName, ArrayName, Dimension = 0) 
;Ollivier 9/8/7 
  PrivateLong90 = PeekL(@ArrayName#() - 8) 
  *PrivateLong91 = PeekL(@ArrayName#() - 12) + 4 
  If PeekL(*PrivateLong91) = 0 
    PrivateLong92 = PrivateLong90 
  Else 
    PrivateLong92 = 1 
    PrivateLong93 = 1 
    PrivateLong94 = 0  
    For PrivateLong96 = 0 To Dimension 
      PrivateLong95 = PrivateLong94 
      PrivateLong94 = PeekL(*PrivateLong91) 
      PrivateLong92 = PrivateLong90 / PrivateLong94 / PrivateLong93 
      PrivateLong93 * PrivateLong92      
      If PrivateLong94 = PrivateLong95: PrivateLong92 = PrivateLong94: EndIf      
      *PrivateLong91 + 4 
    Next 
  EndIf 
  PrivateLongNine#VarName = PrivateLong92 - 1 
  For VarName = 0 To PrivateLongNine#VarName 
EndMacro
Exemples:

Code : Tout sélectionner

Dim Array.S(3, 1, 3, 2, 4) 

; Remplit tout le tableau avec la lettre "A" quelque soit sa taille, et quelque soit le nombre de dimensions
Each(i, Array, 0) 
  Each(j, Array, 1)  
    Each(k, Array, 2) 
      Each(l, Array, 3) 
        Each(m, Array, 4)        
          Array(i, j, k, l, m) = "A" 
        Next 
      Next 
    Next 
  Next 
Next

Code : Tout sélectionner

Dim Array.S(3) 

; Syntaxe simplifiée quand le tableau n'a qu'une dimension
Each(i, Array) 
  Array(i) = "A" 
Next

Code : Tout sélectionner

Dim Array.S(3, 1) 
; /!\
; Eviter de surestimer le nombre de dimensions du tableau sinon division par zéro!
Each(i, Array, 0) 
  Each(j, Array, 1)  
    Each(k, Array, 2) 
      Each(l, Array, 3) 
        Each(m, Array, 4)        
          Array(i, j, k, l, m) = "A" 
        Next 
      Next 
    Next 
  Next 
Next

Code : Tout sélectionner

Dim Array.S(3, 0, 3, 2, 4) 
; /!\
; Eviter de mettre un Zéro (0) dans les paramètres de Dim sinon recherche 
;complètement désorientée et inefficace. En plus, c'est inutile de 
;faire ça!
Each(i, Array, 0) 
  Each(j, Array, 1)  
    Each(k, Array, 2) 
      Each(l, Array, 3) 
        Each(m, Array, 4)        
          Array(i, j, k, l, m) = "A" 
        Next 
      Next 
    Next 
  Next 
Next
Remarque: Certaines variables ont un nom étrange ("PrivateLong..."). L'utilisation d'un tels noms évite qu'il n'y ait de conflit entre les variables de la macro et vos variables. C'est l'équivalent fonctionnel d'une variable locale dans une procédure.
Dernière modification par Ollivier le sam. 11/août/2007 12:40, modifié 3 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Cool 8)

Je la met dans ma hotte
Merci
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Et voici une procédure qui permet d'obtenir le nombre de dimensions d'un tableau. (Si une commande native existe déjà, marrez-vous bien mais faites-moi un petit signe quand même pour me prévenir!)

Code : Tout sélectionner

Procedure.L Burst(*ArrayAdress)
  ; Ollivier 10/8/7
  TotalSize.L = PeekL(*ArrayAdress - 8)
  *Root = PeekL(*ArrayAdress - 12) + 4
  If PeekL(*Root) = 0
    Level.L = 1
  Else
    Divisor.L = 1
    Recup.L = 0
    Max.L = 1
    Level = 0
    Repeat
      OldRecup.L = Recup
      Recup = PeekL(*Root)
      Max = TotalSize / Recup / Divisor
      Divisor * Max     
      *Root + 4
      Level + 1
    Until Recup = OldRecup
  EndIf
  ProcedureReturn Level
EndProcedure
Exemple:

Code : Tout sélectionner

Dim x.L(13); 1 dimension
Dim y.W(2, 3); 2 dimensions
Dim z.B(1, 2, 5); 3 dimensions
Dim t.S(1, 3, 2, 1, 4); 5 dimensions
Debug Burst(@x() )
Debug Burst(@y() )
Debug Burst(@z() )
Debug Burst(@t() )
Répondre