Bonjour à tous
J’utilise sans réserve les macros au point que j’en ai placées dans le répertoire Residents afin de les avoir toujours sous la main.
(dans les modules elles sont disponibles dans tout l’espace de programmation ce qui n’est pas le cas des macros placées dans un module)
Pour la plus part ce sont des macros pour débugger en dynamique un programme ou une procédure.
Par exemple si vous désirez connaitre le contenu de plusieurs variables numériques avec leur nom et le numéro de ligne où elles ont été prélevées
Voila 3 macros.
Code : Tout sélectionner
Macro _q_t_
"
EndMacro
Macro _n (__n)
_q_t_#__n#=_q_t_+Str(__n)+" "
EndMacro
Macro _NL
"N°L=" + Str(#PB_Compiler_Line) + " ** "
EndMacro
elles peuvent être utilisées dans un prg de la façon suivante.
Debug _nl+_n(nomvariable1)+_n(nomvariable2)+_n((nomvariable3)….etc
Et à un autre endroit du prg la même ligne.
Debug _nl+_n(nomvariable1)+_n(nomvariable2)+_n((nomvariable3)….etc
La macro _nl me donnera le numéro de la ligne et les autre instructions _n(..) les variables x et à chacune son nom le tout sur la même ligne.
Voici à titre d’exemple une autre utilisation des macros.
Suite au post
http://www.purebasic.fr/french/viewtopi ... =1&t=15442
Comme l’instruction de tri sur tableau SortStructuredArray(Tableau(), #PB_Sort_Ascending, OffsetOf(Test\Champs1), #PB_Integer)
N’est pas un tri stable c’est a dire si l’on donne deux ordres de tri sur deux champs différents.
Le tri relatif du premier ordre est détruit par le second ordre (voir le détail dans le post).
Parmi les algos de tri il en existe au moins trois qui sont stables. J’ai choisi le tri à bulle,
le plus simple, l’un des moins rapide mais le plus stable pour réaliser un module de tri très stable.
Voici le prg le plus optimisé et aussi le plus généralisé ou le plus banalisé que j'ai pu réaliser.
Il est utilisable dans un même prg principal pour travailler sur plusieurs structures de tables différentes
Dans ce PRG il y a 2 macros principales.
La première MAC_INITPROC(struct_) qui contient une procédure permet de modifier extérieurement le nom de la procédure et la structure du tableau avec lequel elle va travailler.
Ceci permet de réaliser plusieurs tris sur des tableaux de structures différentes.
La deuxième MAC_compare_(test_) simplifie la programmation car pour généraliser et banaliser une procédure de tri
il faut tenir compte du type de tri ascendant ou descendant.
En suite il faut tenir compte du type de champ sur lequel le tri est ordonné.
La combinatoire nous donne 2 ordres de tri et 11 types de champs sans compter dans le champ string les options :
#PB_Ascii : Format ASCII., #PB_UTF8 : Format UTF-8. #PB_Unicode: Format Unicode.
Qui ferait 13 types donc au total 13*2=26 possibilités de trier un tableau et donc 26 fois les instructions de la macro MAC_compare_(test_).
Ici j’ai pris par défaut le format ASCII ce qui limite à 22 possibilités de tri.
Vous pouvez ajouter les deux autres options pour vos besoins personnels.
Code : Tout sélectionner
Structure TEST
Nom.s
Champs1.i
Champs2.d
EndStructure
Global maxt=200
Dim Tableau.Test(MAXT)
Structure TEST2
Nom2.s
Taille2.i
date2.q
EndStructure
Dim Tableau2.Test2(MAXT)
;********************** Toutes les macros et la procedure TRIBULLE font un tout **********************
Macro MAC_compare_(test_)
Repeat
hasChanged=#False
itemCount-1
For i=0 To itemCount
If Bool(test_)
CopyMemory(TAB(i),*Mem,LongTerm)
CopyMemory(TAB(i+1),TAB(i),LongTerm)
CopyMemory(*Mem,TAB(i+1),LongTerm)
hasChanged=#True
EndIf
Next
Until hasChanged=#False
EndMacro
Macro MAC_INITPROC(struct_)
Procedure TRIBULLE#struct_(Array TAB.struct_(1),Offset,Type,ascdesc)
Protected i,itemCount,hasChanged,LongTerm,*mem
itemCount=ArraySize(TAB())
LongTerm=TAB(1)-TAB(0)
*mem=AllocateMemory(Longterm,#PB_Memory_NoClear)
Select ascdesc
;******************************** cas du tri ascendant ******************************
Case #PB_Sort_Ascending
Select Type
Case #PB_Byte ; Le champ de la Structure est un octet (.b)
MAC_compare_(PeekB(tab(i)+offset)>PeekB(TAB(i+1)+offset))
Case #PB_Word ; Le champ de la Structure est un word (.w)
MAC_compare_( PeekW(tab(i)+offset)>PeekW(TAB(i+1)+offset))
Case #PB_Long ; Le champ de la Structure est un long (.l)
MAC_compare_( PeekL(tab(i)+offset)>PeekL(TAB(i+1)+offset))
Case #PB_String ; Le champ de la Structure est un string (.s ou $)
; Les strings fixe (fixed strings) ne sont pas supportées)
; Resultat$ = PeekS(*Memoire [, Longueur [, Format]])
; Format
; #PB_Ascii : Format ASCII.
; #PB_UTF8 : Format UTF-8.
; #PB_Unicode: Format Unicode.
; Par défaut ascii
MAC_compare_( PeekS(PeekL(tab(i)+offset))>PeekS(PeekL(tab(i+1)+offset)))
Case #PB_Float ; Le champ de la Structure est un flottant (.f)
MAC_compare_( PeekF(tab(i)+offset)>PeekF(TAB(i+1)+offset))
Case #PB_Double ; Le champ de la Structure est un double (.d)
MAC_compare_( PeekD(tab(i)+offset)>PeekD(TAB(i+1)+offset))
Case #PB_Quad ; Le champ de la Structure est un quad (.q)
MAC_compare_( PeekQ(tab(i)+offset)>PeekQ(TAB(i+1)+offset))
Case #PB_Character:; Le champ de la Structure est un caractère (.c)
MAC_compare_( PeekC(tab(i)+offset)>PeekC(TAB(i+1)+offset))
Case #PB_Integer ; Le champ de la Structure est un integer (.i)
MAC_compare_(PeekI(tab(i)+offset)>PeekI(TAB(i+1)+offset))
Case #PB_Ascii ; Le champ de la Structure est un caractère ascii (.a)
MAC_compare_( PeekA(tab(i)+offset)>PeekA(TAB(i+1)+offset))
Case #PB_Unicode ; Le champ de la Structure est un caractère unicode (.u)
MAC_compare_( PeekU(tab(i)+offset)>PeekU(TAB(i+1)+offset))
EndSelect
;******************************** cas du tri descendant ******************************
Case #PB_Sort_Descending
Select Type
Case #PB_Byte ; Le champ de la Structure est un octet (.b)
MAC_compare_( PeekB(tab(i)+offset)<PeekB(TAB(i+1)+offset))
Case #PB_Word ; Le champ de la Structure est un word (.w)
MAC_compare_( PeekW(tab(i)+offset)<PeekW(TAB(i+1)+offset))
Case #PB_Long ; Le champ de la Structure est un long (.l)
MAC_compare_( PeekL(tab(i)+offset)<PeekL(TAB(i+1)+offset))
Case #PB_String ; Le champ de la Structure est un string (.s ou $)
; Les strings fixe (fixed strings) ne sont pas supportées)
; Resultat$ = PeekS(*Memoire [, Longueur [, Format]])
; Format
; #PB_Ascii : Format ASCII.
; #PB_UTF8 : Format UTF-8.
; #PB_Unicode: Format Unicode.
; Par défaut ascii
MAC_compare_( PeekS(PeekL(tab(i)+offset))<PeekS(PeekL(tab(i+1)+offset)))
Case #PB_Float ; Le champ de la Structure est un flottant (.f)
MAC_compare_( PeekF(tab(i)+offset)<PeekF(TAB(i+1)+offset))
Case #PB_Double ; Le champ de la Structure est un double (.d)
MAC_compare_( PeekD(tab(i)+offset)<PeekD(TAB(i+1)+offset))
Case #PB_Quad ; Le champ de la Structure est un quad (.q)
MAC_compare_( PeekQ(tab(i)+offset)<PeekQ(TAB(i+1)+offset))
Case #PB_Character:; Le champ de la Structure est un caractère (.c)
MAC_compare_( PeekC(tab(i)+offset)<PeekC(TAB(i+1)+offset))
Case #PB_Integer ; Le champ de la Structure est un integer (.i)
MAC_compare_( PeekI(tab(i)+offset)<PeekI(TAB(i+1)+offset))
Case #PB_Ascii ; Le champ de la Structure est un caractère ascii (.a)
MAC_compare_( PeekA(tab(i)+offset)<PeekA(TAB(i+1)+offset))
Case #PB_Unicode ; Le champ de la Structure est un caractère unicode (.u)
MAC_compare_( PeekU(tab(i)+offset)<PeekU(TAB(i+1)+offset))
EndSelect
EndSelect
EndProcedure
EndMacro
;********************** Fin de toutes les macros et de la procedure TRIBULLE **********************
Procedure RandomSign()
ProcedureReturn Random(1)*2-1
EndProcedure
For I=0 To MAXT
Tableau(I)\Champs1=Random(9,0)*RandomSign()
Tableau(I)\Champs2=Random(1000,100)*RandomSign()
tableau(i)\Nom="Dupond Pierre Jean Simon"+RSet(Str(Random(MAXt,0)),3,"0")
Next
; For I = 0 To MAXT
; Debug RSet(Str(Tableau(I)\Champs1), 3, " ") + "=> " + RSet(Str(Tableau(I)\Champs2), 4, "0")+ " "+tableau(I)\Nom
; Next
Debug "******************** Apès Tri"
MAC_INITproc(TEST) ; Donnez le nom de la structure au tableau de la procedure TRIBULLE donne comme nom de procédure TRIBULLEtest
; TRIBULLE(tableau(),OffsetOf(test\Champs1),TypeOf(test\Champs1),#PB_Sort_Descending)
; TRIBULLE(tableau(),OffsetOf(test\Champs1),TypeOf(test\Champs1),#PB_Sort_Ascending)
; TRIBULLE(tableau(),OffsetOf(test\Nom),TypeOf(test\Nom),#PB_Sort_Ascending)
; TRIBULLE(tableau(),OffsetOf(test\Nom),TypeOf(test\Nom),#PB_Sort_Descending)
; TRIBULLE(tableau(),OffsetOf(test\Champs2),TypeOf(test\Champs2),#PB_Sort_Descending)
TRIBULLEtest(tableau(),OffsetOf(test\Champs2),TypeOf(test\Champs2),#PB_Sort_Ascending)
TRIBULLEtest(tableau(),OffsetOf(test\Champs1),TypeOf(test\Champs1),#PB_Sort_Ascending)
For I=0 To MAXT
Debug RSet(Str(Tableau(I)\Champs1),3," ")+"=> "+RSet(Str(Tableau(I)\Champs2),4,"0")+" "+tableau(I)\Nom
Next
Debug " ****************** Deuxième Procédure avec pour structure test2 *************** "
For I=0 To MAXT
Tableau2(I)\Taille2=Random(220,120)
Tableau2(I)\date2=Date(Random(2018,1970),Random(12,1),Random(28,1),0,0,0)
tableau2(i)\Nom2="Dupond2 Pierre Jean Simon"+RSet(Str(Random(MAXt,0)),3,"0")
Next
MAC_INITproc(test2) ; Donnez le nom de la structure au tableau de la procedure TRIBULLE donne comme nom de procédure TRIBULLEtest2
TRIBULLEtest2(tableau2(),OffsetOf(test2\date2),TypeOf(test2\date2),#PB_Sort_Descending)
TRIBULLEtest2(tableau2(),OffsetOf(test2\Taille2),TypeOf(test2\Taille2),#PB_Sort_Ascending)
masque$="%yyyy/%mm/%dd"
For I=0 To MAXT
Debug RSet(Str(Tableau2(I)\Taille2),4," ")+"=> "+ FormatDate(Masque$, Tableau2(I)\date2)+" "+tableau2(I)\Nom2
Next
A+