Macros

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Macros

Message 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
Dernière modification par Dr. Dri le ven. 19/mai/2006 8:37, modifié 1 fois.
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Je comprend pas, sa sert a quoi les macro ? :oops:
Lna
Messages : 181
Inscription : mar. 21/juin/2005 11:11

Message 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 +
wolfjeremy
Messages : 1202
Inscription : sam. 31/déc./2005 23:52

Message par wolfjeremy »

Ha ok merci :) c'est pas mal !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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:
Image
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 ^^
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.
Avatar de l’utilisateur
Ulix
Messages : 315
Inscription : ven. 04/juin/2004 14:27
Localisation : Frontignan

Message 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 +
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 ^^
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

sympa cette petites macros, merci. :wink:
Image
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Comment on appelle une macro ?
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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:
Image
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Ok, je suis encore sous PB 3.94 malgré que G DL la v4...
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Répondre