Page 1 sur 2

Macros

Publié : sam. 11/mars/2006 14:35
par Dr. Dri
Quelques macros en vrac ^^

macros "FileSystem"

Code : Tout sélectionner

Macro FileExists(FileName)
  (FileSize(FileName) >= 0 And #True)
EndMacro

Macro PathExists(PathName)
  (FileSize(PathName) = -2 And #True)
EndMacro

Macro AddFileAttributes(File, Attributes)
  SetFileAttributes(File, GetFileAttributes(File) | Attributes)
EndMacro

Macro RemFileAttributes(File, Attributes)
  SetFileAttributes(File, GetFileAttributes(File) ! Attributes)
EndMacro

Macro HasFileAttributes(File, Attributes)
  (((GetFileAttributes(File) & Attributes) <> 0) Or #False)
EndMacro
macros IsAscii (marche pas avec l'ascii étendu)

Code : Tout sélectionner

Macro IsUpper(c)
  ((c >= 'A') And (c <= 'Z'))
EndMacro

Macro IsLower(c)
  ((c >= 'a') And (c <= 'z'))
EndMacro

Macro IsAlpha(c)
  (IsUpper(c) Or IsLower(c))
EndMacro

Macro IsDigit(c)
  ((c >= '0') And (c <= '9'))
EndMacro

Macro IsAlnum(c)
  (IsAlpha(c) Or IsDigit(c))
EndMacro

Macro IsXDigit(c)
  (IsDigit(c) Or ((c >= 'a') And (c <= 'f')) Or ((c >= 'A') And (c <= 'F')))
EndMacro

Macro IsPunct(c)
  ((c = '"') Or FindString("!#%&'();<=>?[\]*+,-./:^_{|}~", Chr(c), 1))
EndMacro

Macro IsGraph(c)
  (IsAlnum(c) Or IsPunct(c))
EndMacro

Macro IsPrint(c)
  ((c = ' ') Or IsGraph(c))
EndMacro

Macro IsSpace(c)
  ((c = ' ') Or (c = #FF) Or (c = #LF) Or (c = #CR) Or (c = #HT) Or (c = #VT))
EndMacro

Macro IsBlank(c)
  ((c = ' ') Or (c = #TAB))
EndMacro

Macro IsCntrl(c)
  ((c = #BEL) Or (c = #BS))
EndMacro

Procedure.l IsNumeric(String.s)
  Protected Numeric.l, *String.Character
  
  If String
    Numeric = #True
    *String = @String
    
    While Numeric And *String\c
      Numeric = IsDigit(*String\c)
      *String + SizeOf(Character)
    Wend
  EndIf
  
  ProcedureReturn Numeric
EndProcedure
Dri

Publié : sam. 11/mars/2006 14:45
par wolfjeremy
Je comprend pas, sa sert a quoi les macro ? :oops:

Publié : sam. 11/mars/2006 17:17
par Lna
Les macros servent à optimiser la vitesse d'exécution du programme 8) , au détriment de celle de compilation :( .

Les macros c'est comme du copier coller avec des paramètres.

Procédure : passage de paramètres par la pile + accès à la procédure + exécution programme + retour procédure
Macro : exécution programme

Rapidité d'exécution programme : Macro plus rapide que procédure
Place occupé dans le programme : Procédure plus courte que macro si employé plus d'une (à plusieurs) fois.

Cela permet aussi de simplifier l'écriture de tout texte qui se répete.
Il devient possible de redéfinir la syntaxe des instructions par la sienne sans changer la rapidité d'exécution du programme.

Beaucoup d'avantages pour nous. :wink:

A +

Publié : sam. 11/mars/2006 18:36
par wolfjeremy
Ha ok merci :) c'est pas mal !

Publié : lun. 13/mars/2006 16:58
par Dr. Dri
Macros MakeInteger
Fabrique un entier avec deux moitiés et récupère les deux moitiés d'un entier

Code : Tout sélectionner

Macro MakeQuad(HiLong, LoLong)
  (HiLong << 32 | LoLong)
EndMacro

Macro HiLong(Quad)
  ((Quad >> 32) & $FFFFFFFF)
EndMacro

Macro LoLong(Quad)
  (Quad & $FFFFFFFF)
EndMacro

Macro MakeLong(HiWord, LoWord)
  (HiWord << 16 | LoWord)
EndMacro

Macro HiWord(Long)
  ((Long >> 16) & $FFFF)
EndMacro

Macro LoWord(Long)
  (Long & $FFFF)
EndMacro

Macro MakeWord(HiByte, LoByte)
  (HiByte << 8 | LoByte)
EndMacro

Macro HiByte(Word)
  ((Word >> 8) & $FF)
EndMacro

Macro LoByte(Word)
  (Word & $FF)
EndMacro

Macro MakeByte(HiNibble, LoNibble)
  (HiNibble << 4 | LoNibble)
EndMacro

Macro HiNibble(Byte)
  ((Byte >> 4) & $F)
EndMacro

Macro LoNibble(Byte)
  (Byte & $F)
EndMacro
Dri

Publié : lun. 13/mars/2006 20:54
par Flype
Pour inverser un LONG ( $22334455 -> $55443322 ) :

Code : Tout sélectionner

Macro RevL(a)
  ( ((a)>>24) | ((a)<<24) | (((a)&$FF0000)>>8) | (((a)&$FF00)<<8) )
EndMacro 
Mais comment ferais-tu pour faire RevQ(), DrDri ?

Année Bissextile :

Code : Tout sélectionner

Macro IsLeapYear(year)
  ((Not year%400) Or ((year%100) And (Not year%4)))
EndMacro
Un truc qui serait pas mal :
Dans l'IDE Purebasic, il y a dans la barre latérale 'Modèle' ou 'Templates', qui est sauvegardé dans 'templates.prefs'.

Pour ma part, j'ai commencé à me faire aussi une petite collection de fonctions rangées par rubriques et sous-rubriques :

Code : Tout sélectionner

+ Window
   + Style
   + ExStyle
+ Gadget
   + ListIconGadget
   + SplitterGadget
+ Math
   + Angle
   + Surface
+ 2D
   + Primitives
Je n'y ai mis que des macros.
Ca pourrait être sympa de se concocter un 'template.prefs' public
à télécharger facilement ici sur ce forum, et facile à mettre à jour.
Et pour que ce soit réellement intéressant, il faut que l' 'arbre' soit
bien structuré.
:roll:

Publié : mar. 14/mars/2006 12:23
par Dr. Dri
Comme ceci ^^
(Ce serait même pas mal une collection de macros officielle!)

Code : Tout sélectionner

Macro BSwapW(Word)
  (((Word & $00FF) << 8) | ((Word & $FF00) >> 8))
EndMacro

Macro BSwapL(Long)
  (((Long&$FF000000)>>24) | ((Long&$FF)<<24) | (((Long)&$FF0000)>>8) | (((Long)&$FF00)<<8) )
EndMacro

Macro BSwapQ(Quad)
  (MakeQuad(BSwapL(LoLong(Quad)), BSwapL(HiLong(Quad))))
EndMacro

a.q = $1122334455667788
Debug HexQ(a)
a = BSwapQ(a)
Debug HexQ(a)
Dri ^^

Publié : mar. 14/mars/2006 12:37
par nico
J'ai demandé une rubrique à Fred, il a lu mon message mais je n'ai pas eu de réponse pour l'instant.

Publié : mar. 14/mars/2006 13:47
par Ulix
Dr. Dri a dit :

(Ce serait même pas mal une collection de macros officielle!)
+ 1 :idea:

Pourquoi ne pas organisé un sondage sur le sujet ?

A +

Publié : ven. 28/avr./2006 20:43
par Dr. Dri
Macros Memory
pour copier et comparer des structures
ca ne duplique/compare pas les chaines de caractère
(y'avait tout un sujet sur une commande "CopyStructure" =)

ca sert juste de raccourci pour avoir un code plus lisible ^^

Code : Tout sélectionner

Macro Copy(Type, Source, Destination)
  CopyMemory(Source, Destination, SizeOf(Type#))
EndMacro

Macro Move(Type, Source, Destination)
  MoveMemory(Source, Destination, SizeOf(Type#))
EndMacro

Macro Compare(Type, Source1, Source2)
  CompareMemory(Source1, Source2, SizeOf(Type#))
EndMacro

Define.LOGBRUSH brush1, brush2

;initialise la structure
With brush1
  \lbStyle = #BS_SOLID
  \lbColor = #White
EndWith

;copie la structure
Copy(LOGBRUSH, brush1, brush2)

;vérifie que brush1 = brush2
If Compare(LOGBRUSH, brush1, brush2)
  ;ca correspond, affiche la couleur
  Debug Hex(brush2\lbColor)
EndIf
Dri ^^

Publié : ven. 28/avr./2006 21:42
par Flype
sympa cette petites macros, merci. :wink:

Publié : ven. 28/avr./2006 23:13
par Backup
je pense qu'au lieu de faire des macros " officiel "
se serai bien que Fred fasse les fonctions equivalente en "ordre" pureBasic
en s"inspirant de vos idées !!

ce serai beucoup plus simple ...

les Macro doivent rester un petit paliatif a certain manque , ou une astuce
TEMPORAIRE
sinon autant donner les moyens au programmeur purebasic, en mettant a disposition les fonction qui manque et que vous soulignez !:D

Publié : dim. 30/avr./2006 20:34
par SPH
Comment on appelle une macro ?

Publié : dim. 30/avr./2006 21:10
par Flype
tu sais que c'est une spécificité PB4.0 ?
Une Macro s'appelle comme une procédure...
je saisi pas trop ta question en fait, ya plein d'exemples au dessus en plus. :roll:

Publié : dim. 30/avr./2006 21:14
par SPH
Ok, je suis encore sous PB 3.94 malgré que G DL la v4...