Page 1 sur 1

Gosub dans une procédure (adaptation forum anglais)

Publié : ven. 09/oct./2015 10:58
par PAPIPP
Bonjour à tous

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

Alors voici une adaptation aux versions PB > 530 permettant l’utilisation de _gosub.

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
_Gosub(label11, label2 de retour)
Label2: : *** label de retour
…..

label11:

_Gosub(label20, label21 de retour)
Label21:

_return

Label20:

return
A+

Re: Gosub dans une procédure (adaptation forum anglais)

Publié : ven. 09/oct./2015 11:00
par microdevweb
Merci pour ce partage, même si je ne suis pas fan des Gosub cela peut être utilise.