J’ai comme l’impression d’avoir pollué le post sur http://www.purebasic.fr/french/viewtopi ... 0&start=15. avec mes vielles macros.
Je poste ici le prg optimisé et généralisé pour ceux qui sont sensés comprendre.
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 le 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