un petit example d'utilisation de pointeurs pour wolfjeremy:
pour example, je choisis de montrer comment une procédure
peut renvoyer plusieurs valeurs d'un coup.
Un seul ProcedureReturn donc, pour plusieurs valeurs retournées.
un pointeur n'a besoin d'avoir une étoile pour se comporter
comme un pointeur. mais son utilisation va en être limitée !
regarde ici comment on aurait fait sans connaitre les structures :
1/
allocation d'un bloc de mémoire de la taille de tous les arguments
taille = 1 octet (.b) + 4 octets (.l) + 4 octets (.s) = 9 octets
args.l est donc le pointeur sur un bloc mémoire
2/
on 'poke' la mémoire avec nos valeurs
3/
et on la 'peek'
4/
on libère la mémoire allouée
Code : Tout sélectionner
Procedure.l MaProcedure_Alloc()
Protected args.l = AllocateMemory(1+4+4)
If args
PokeB(args+0, #True)
PokeL(args+1, 123)
PokeS(args+5, "456")
EndIf
ProcedureReturn args
EndProcedure
Procedure.l MaProcedure_Free(args)
If args
FreeMemory(args)
EndIf
EndProcedure
a.l = MaProcedure_Alloc()
If a
Debug PeekB(a+0)
Debug PeekL(a+1)
Debug PeekS(a+5)
MaProcedure_Free(a)
EndIf
bon, çà c'était avant...
en rajoutant maintenant l'étoile devant notre pointeur on peut lui coller une structure derrière (hum).
args devient *args.ARGUMENTS
ainsi PokeL(args+1, 123) devient *args\lValeur = 123
avec les structures c'est plus de code mais c'est surtout plus lisible, plus souple.
Code : Tout sélectionner
Structure ARGUMENTS
bValeur.b
lValeur.l
sValeur.s
EndStructure
Procedure.l MaProcedure_Alloc()
Protected *args.ARGUMENTS = AllocateMemory(SizeOf(ARGUMENTS))
If *args
*args\bValeur = #True
*args\lValeur = 123
*args\sValeur = "456"
EndIf
ProcedureReturn *args
EndProcedure
Procedure.l MaProcedure_Free(*args.ARGUMENTS)
If *args
FreeMemory(*args)
EndIf
EndProcedure
*a.ARGUMENTS = MaProcedure_Alloc()
If *a
Debug *a\bValeur
Debug *a\lValeur
Debug *a\sValeur
MaProcedure_Free(*a)
EndIf