Je ne penses pas que titre soit des plus explicite, mais voici de quoi il s'agis exactement
Passé une map en paramètre de procédure et n'agir que sur certains éléments.
Contrainte (avec un long) 32 éléments dans la map seulement.
Voila si cela peut vous servir.
Première exemple avec des chaînes de caractères.
Code : Tout sélectionner
; exemple avec un map de maximum 32 éléments
; et des flags de sélection
EnumerationBinary
#P_1
#P_2
#P_3
#P_4
#P_5
; etc ... 32 possibilités au total
EndEnumeration
Global NewMap myFruts.s() ; map de fruits
; j'ajoute quelques fruits pour l'exercice
AddMapElement(myFruts(),Str(#P_1))
myFruts()= "Pomme"
AddMapElement(myFruts(),Str(#P_2))
myFruts()= "Bannane"
AddMapElement(myFruts(),Str(#P_3))
myFruts()= "Orange"
AddMapElement(myFruts(),Str(#P_4))
myFruts()= "Poire"
AddMapElement(myFruts(),Str(#P_5))
myFruts()= "Fraise"
Procedure test(Map mp.s(),flags)
Protected i,index= #P_1 ; on commence par le premier élement
; parcours des 32 possibités
For i = 0 To 31
If flags & index
If FindMapElement(mp(),Str(index))
Debug mp()
EndIf
EndIf
index = index<<1 ; décalkages des bit à gauche
Next
EndProcedure
test(myFruts(),#P_1|#P_3|#P_5)
Code : Tout sélectionner
; exemple avec un map de maximum 32 éléments
; et des flags de sélection
EnumerationBinary
#P_1
#P_2
#P_3
#P_4
#P_5
; etc ... 32 possibilités au total
EndEnumeration
Global NewMap *myNumber() ; map d'adresse de nombre
Global.l n1=2,n2=4,n3=8,n4=16,n5=32
; j'ajoute quelques nombres pour l'exercice
AddMapElement(*myNumber(),Str(#P_1))
*myNumber()= @n1
AddMapElement(*myNumber(),Str(#P_2))
*myNumber()= @n2
AddMapElement(*myNumber(),Str(#P_3))
*myNumber()= @n3
AddMapElement(*myNumber(),Str(#P_4))
*myNumber()= @n4
AddMapElement(*myNumber(),Str(#P_5))
*myNumber()= @n5
Procedure test(Map *mp(),flags)
Protected i,index= #P_1 ; on commence par le premier élement
; parcours des 32 possibités
For i = 0 To 31
If flags & index
If FindMapElement(*mp(),Str(index))
; ici on multiplie par deux (pour l'exemple)
PokeL(*mp(),PeekL(*mp()) * 2)
EndIf
EndIf
index = index<<1 ; décalkages des bit à gauche
Next
EndProcedure
test(*myNumber(),#P_1|#P_3|#P_5)
Debug n1
Debug n2
Debug n3
Debug n4
Debug n5
Code : Tout sélectionner
; exemple avec un map de maximum 32 éléments
; et des flags de sélection
EnumerationBinary
#P_1
#P_2
#P_3
#P_4
#P_5
; etc ... 32 possibilités au total
EndEnumeration
Prototype p_proc(*value) ; un prototype pour l'appel de la procédure
Global NewMap *myProc() ; map d'adresses de procédure
Procedure proc_1(*value)
PokeL(*value,PeekL(*value) * 2)
Debug "call procedure 1 value * 2 = "+Str(PeekL(*value))
EndProcedure
Procedure proc_2(*value)
PokeL(*value,PeekL(*value) / 2)
Debug "call procedure 2 value / 2 = "+Str(PeekL(*value))
EndProcedure
Procedure proc_3(*value)
PokeL(*value,PeekL(*value) + 10)
Debug "call procedure 3 value + 10 = "+Str(PeekL(*value))
EndProcedure
Procedure proc_4(*value)
PokeL(*value,PeekL(*value) - 3)
Debug "call procedure 4 value - 3 = "+Str(PeekL(*value))
EndProcedure
Procedure proc_5(*value)
PokeL(*value,PeekL(*value) + 8)
Debug "call procedure 5 value + 8 = "+Str(PeekL(*value))
EndProcedure
; j'ajoute quelques procédures pour l'exercice
AddMapElement(*myProc(),Str(#P_1))
*myProc()= @proc_1()
AddMapElement(*myProc(),Str(#P_2))
*myProc()= @proc_2()
AddMapElement(*myProc(),Str(#P_3))
*myProc()= @proc_2()
AddMapElement(*myProc(),Str(#P_4))
*myProc()= @proc_4()
AddMapElement(*myProc(),Str(#P_5))
*myProc()= @proc_5()
Procedure test(Map *mp(),*nombre,flags)
Protected i,index= #P_1 ; on commence par le premier élement
Protected myProcedure.p_proc
; parcours des 32 possibités
For i = 0 To 31
If flags & index
If FindMapElement(*mp(),Str(index))
myProcedure = *mp()
myProcedure(*nombre)
EndIf
EndIf
index = index<<1 ; décalkages des bit à gauche
Next
EndProcedure
Global value.l = 20
test(*myProc(),@value,#P_1|#P_3|#P_5)
Debug value