Page 1 sur 1

Simuler un gosub avec une macro ?

Publié : mer. 03/mai/2006 11:28
par Ulix
Est-il possible de simuler un Gosub avec une macro ?

Pourquoi cette question ?
D'abord je m'attendais a ce que la nouvelle version de PB (Fred tu peut encore la rajouté) permette de geré des gosubs interne a une procedure avec un accés aux variables locale. Hélas...:mad: je suis déçu que ce ne soit pas le cas !

Ensuite un exemple etant plus parlant, voici ce que désirais faire :

Code : Tout sélectionner



;Procedure affichage() 		; Si décommentaire, marche pas
;Protected a, b, c, d
;Static f, g, h, i

a=100:b=50:c=25:d=10

For nombre = 1 To 4
Select nombre
Case 1 : Gosub colonne1
Case 2 : Gosub colonne2
Case 3 : Gosub colonne1_3
Case 4 : Gosub colonne1_5:Gosub colonne2
EndSelect
Next
End


Colonne1:
f+1
Debug "Utilisation de Colonne1 = "+Str(f)
Debug a=a+c
Return

Colonne2:
g+1
Debug "Utilisation de Colonne2 = "+Str(g)
Debug b=d+c
Return

Colonne1_3:
h+1
Debug "Utilisation de Colonne1_3 = "+Str(h)
Debug a=a-b
Return

Colonne1_5:
i+1
Gosub colonne1
Gosub colonne1_3
Debug "Utilisation de Colonne1_5 = "+Str(g)
Return
;EndProcedure

;affichage()




Quelques réflexions (vous les savez !)

On notera que les sous-programmes (labels) peut être appele de plusieurs endroits différents, qu'il peut être utilisé plusieurs fois, enfin qu'un sous-programme peut appeler un autre sous-programme.
Une fois le sous-programme fini, le programme reprend a l'instruction qui suit celle qui l'avait appelé.
Utilisation des gosub/return simplifie le code et le rend plus compacte.
Enfin l'accées aux variables locales permet de ne pas muiltiplié les procedures a l'excés et d'avoir une ribanbelle de données a passés comme arguments.
Bref, je leurs trouve que des avantages ! :lol:

Puisque le "Gosub nouvelle version" n'est pas au rendez-vous, ma question est :

Est-il possible de simuler un Gosub avec une macro ?


Est-il possible lorsque l'on appelle un sous-programme :
- de mémorisé la position mémoire de l'instruction qui appele le sous-programme (j'espére que vous comprenez),
- d'aller au sous-programme (le label:)
- d'executer le sous-programme et une fois finie (donc le return)
- de se repositionné sur l'instruction suivant (position mémoire + 1 instruction).


Je suppose que l'on doit faire appelle a du code assembleur, mais est-il possible d'intégré cela dans une macro ?


Est-il possible de "lorsque l'on appelle un sous-programme, de mémorisé la position mémoire de l'instruction qui appele le sous-programme" ?
Il y a bien la posibilité de connaitre l'adresse d'une variable, la position mémoire : Pointeur = ?Variable, peut-on connaitre l'instruction courante ?

Y a t-il des exemples ? :oops:


Merci de votre patience et de m'avoir lu ! :wink: