Gosub dans une procédure (adaptation forum anglais)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Gosub dans une procédure (adaptation forum anglais)

Message 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+
Dernière modification par PAPIPP le ven. 09/oct./2015 11:38, modifié 1 fois.
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

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

Message par microdevweb »

Merci pour ce partage, même si je ne suis pas fan des Gosub cela peut être utilise.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre