Gosub ne peut être utilisé dans une procédure comme l’exemple suivant le montre.
Code : Tout sélectionner
Procedure test1()
fac.d=1
For i=1 To 20
Gosub factorial;;;; ****** interdit dans une procedure
PrintN(Str(fac))
Next
ProcedureReturn
;******** Gosub dans procedure *******
factorial: ;;; ****** label de début de la subroutine
fac=fac*i
Return ;;; ****** fin de la subroutine
EndProcedure
OpenConsole()
test1()
Input()
CloseConsole()
End
Code : Tout sélectionner
Macro _gosub(label,retrn)
adretourgosub=?retrn
! lea eax,[ll_testfac_#label] ;;;; Le label dans une procédure est défini ll_nomprocedure_label
! jmp eax
EndMacro
Macro _return
! jmp [v_AdRetourGosub] ;;;***** respectez la casse avec la définition shared de la procédure
EndMacro
Procedure testfac() ; procedure de test pour tester l'option _gosub
Shared AdRetourGosub.l ;;;***** respectez la casse avec l'instruction jmp [v_AdRetourGosub]
fac.d=1
For i=1 To 20
_gosub(factorial,l1) ;vous devez fournir une étiquette de retour, dans ce cas L1 label suivant
PrintN(" ne doit jamais être exécuté")
l1:
PrintN(" n="+Str(i)+" fac(n)="+Str(fac))
Next
som.d=0
For i=1 To 20
_gosub(somme,l2) ;vous devez fournir une étiquette de retour, dans ce cas L1 label suivant
PrintN("ne doit jamais être exécuté")
l2:
PrintN(" n="+Str(i)+" somme(n)="+Str(som))
Next
ProcedureReturn
;******** _gosub factorial dans procedure *******
Factorial: ;;; ****** label de début de la subroutine factorial
fac*i
_return ;;; ****** fin de la subroutine factorial
;;******* _gosub somme des n premiers
somme: ;;; ****** label de début de la subroutine somme
som+i
_return;;; ****** fin de la subroutine somme
EndProcedure
OpenConsole()
testfac()
Input()
CloseConsole()
End
L’ensemble des 2 macros permet d’utiliser _gosub plusieurs fois avec des procédures différentes.
Mais avec cette procédure on ne peut imbriquer les _gosub avec des subroutines différentes.
Exemples autorisés :
_Gosub(label11, label2 de retour)
Label2:
_Gosub(label11, label3 de retour)
Label3:
_Gosub(label20, label21 de retour)
Label21:
_Gosub(label20, label22 de retour)
Label22:
_Gosub(label11, label12 de retour)
label11:
…
_return
Label20:
…
return
Par contre sont interdites les procédures imbriquées suivantes
A+_Gosub(label11, label2 de retour)
Label2: : *** label de retour
…..
label11:
…
_Gosub(label20, label21 de retour)
Label21:
_return
Label20:
…
return