Page 1 sur 2

Sortie de plusieurs procedures ou de boucles.

Publié : sam. 04/nov./2006 11:13
par Kwai chang caine
Bonjour a tous

Est il possible de sortir d'un coup de plusieurs procedures qui sont imbriquées les unes dans les autres, pour revenir a la "racine" du programme.

Merci
Bonne journée

Publié : sam. 04/nov./2006 11:44
par SPH
If condition : goto SORTIE : EndIf

Publié : sam. 04/nov./2006 12:34
par Kwai chang caine
Bonjour SPH

Le fait de sortir d'un coup d'une ou plusieures procedures sans la finir ou bien faire ProcedureReturn ne pose donc aucun probleme, d'apres toi ???
Il ne va pas se perdre si on le fait souvent ????

Je suis content de l'apprendre, car je sortais a chaque fois de chaque procedure en verifiant une variable globale si elle etait a 1 je ressortais de la 2e etc ... :lol:

Donc on peut faire ça sans que jamais ça pose de problemes :

Code : Tout sélectionner


Procedure D()

 Reponse = MessageRequester("","Désirez vous sortir de D",4)
 
 If reponse = 6
  Goto Sortie
 EndIf
  
EndProcedure

Procedure C()
 
 Reponse = MessageRequester("","Désirez vous sortir de C",4)
 
 If reponse = 6
  Goto Sortie
 EndIf
 
 D()
 
EndProcedure

Procedure B()
 
 Reponse = MessageRequester("","Désirez vous sortir de B",4)
 
 If reponse = 6
  Goto Sortie
 EndIf
 
 C()
 
EndProcedure

Procedure A()
 
 Reponse = MessageRequester("","Désirez vous sortir de A",4)
 
 If reponse = 6
  Goto Sortie
 EndIf
 
 B()
 
EndProcedure

Sortie:
A()
B()
C()
D()

End

Bon je te remercie de l'info qui etait tellement simple que je n'osais pas le faire. 8)

Excelente journée à toi.

Publié : sam. 04/nov./2006 13:25
par SPH
Moi, je ne fais jamais de procedures en fait. Mais je sort de tas de choses avec un GOTO et ca fonctionne tres bien.

Publié : sam. 04/nov./2006 14:09
par Flype
La vieille école quoi...


On peut tout aussi bien y arriver et plus proprement en construisant des procédures récursives bien pensées :roll:

Code : Tout sélectionner

Procedure D()
  If MessageRequester("D()", "Désirez vous sortir de D ?", #PB_MessageRequester_YesNo) = #IDNO
    ProcedureReturn #True
  EndIf
EndProcedure

Procedure C()
  If MessageRequester("C()", "Désirez vous sortir de C ?", #PB_MessageRequester_YesNo) = #IDNO
    ProcedureReturn D()
  EndIf
EndProcedure

Procedure B()
  If MessageRequester("B()", "Désirez vous sortir de B ?", #PB_MessageRequester_YesNo) = #IDNO
    ProcedureReturn C()
  EndIf
EndProcedure

Procedure A()
  If MessageRequester("A()", "Désirez vous sortir de A ?", #PB_MessageRequester_YesNo) = #IDNO
    ProcedureReturn B()
  EndIf
EndProcedure

Debug "Résultat de A : " + Str(A())
Debug "Résultat de B : " + Str(B())
Debug "Résultat de C : " + Str(C())
Debug "Résultat de D : " + Str(D())

End 

J'admets que Goto présente quelques avantages :
. une certaine rapidité d'exécution
. une certaine lisibilité

mais présente aussi quelques désavantages :
. ré-exploitation du code difficile
. une certaine illisibilité
. situation inattendue

Publié : sam. 04/nov./2006 14:09
par Backup
SPH a écrit :If condition : goto SORTIE : EndIf
surtout pas !! 8O

le mieux pour sortir d'une procedure c'est de sauter a la fin de la procedure
JAMAIS en dehors !! sinon bonjours les problemme de pile !!


Procedure.f titi(par.f)
     If par.f >10 ; si sup a 10 on divise par 2
        t.f=par.f/2
         Goto fin ; Goto seulement dans procedure pas en dehors !!!!
         ; sinon problem de pile !!
     EndIf
    t=par*2 ; sinon on multiplie
    fin:
     ProcedureReturn t.f
EndProcedure


resultat.f=titi(2)
Debug resultat
resultat.f=titi(15)
Debug resultat

Publié : sam. 04/nov./2006 14:27
par Backup
en clair chaque Procédure rencontrer DOIT avoir son ENDPROCEDURE
rencontré

donc les sauts sont a effectuer a l'intérieur de la procédure,Jamais a L'extérieur :D

Publié : sam. 04/nov./2006 14:29
par Flype
tout à fait.

Publié : sam. 04/nov./2006 17:41
par Kwai chang caine
Merci à vous trois de ces eclaicissements.

Il me semblait bien de mes vieux souvenirs de Qbasic qu'il ne fallait pas sauter en dehors d'une procedure.

Donc d'apres DOBRO ma methode de variable en globale n'est pas si toc.
Qui permet de sortir une a une de chaque procedure.

Par contre elle est bien moins jolie que celle de flype.
Génial cette methode FLYPE, je ne savais pas que l'on pouvait faire un ProcedureReturn sur une autre procedure. 8)
J'ai fait du pas à pas sur ton code si simple qu'il en ai compliqué pour moi :lol: et ce que je ne comprend pas, c'est pourquoi dans un sens avec le ProcedureReturn B() on saute bien a la procedure B, mais que quand on arrive au EndProcedure de B on ne passe pas par la procedure A() d'ou l'on viens ???? 8O
J'ai mal vu ou est-ce normal ??? :oops:
Pourrais tu m'expliquer ça ???

Je vous remercie tous de votre aide.
Excelente journée à vous trois. :)

Publié : dim. 05/nov./2006 8:35
par Kwai chang caine
J'ai une question du meme style.

Est ce que l'on peut sortir d'un repeat/until ou while/wend avec un GOTO sans que cela pose de probleme.

Merci.

Publié : dim. 05/nov./2006 9:51
par julien
Kwai chang caine a écrit :J'ai une question du meme style.

Est ce que l'on peut sortir d'un repeat/until ou while/wend avec un GOTO sans que cela pose de probleme.

Merci.
Non, si tu reste dans la même procedure, mais utilise plutôt "Break"

Publié : dim. 05/nov./2006 9:58
par Backup
Kwai chang caine a écrit :J'ai une question du meme style.

Est ce que l'on peut sortir d'un repeat/until ou while/wend avec un GOTO sans que cela pose de probleme.

Merci.
oui ! du moment que tu ne sorte pas d'une procedure ! :D

et il vaut mieux utiliser "Break" comme te dit Julien :D

Publié : dim. 05/nov./2006 11:23
par flaith
j'ai posé une question, sur le forum anglais, sur le comportement étrange de l'instruction "goto" dans une procédure, mais dans un "select..endselect", le code est le suivant

Code : Tout sélectionner

;Global cmd.s, valeur.s, valeur_tmp.s, line.s

Procedure test_select(v.l)
Protected cmd.s, valeur.s, valeur_tmp.s, line.s

line = "T S A = 45"
cmd = Left(line,1)
valeur = Mid(line,3,Len(line)-3)

again:
MessageRequester("APPEL #"+Str(v),"CMD = ["+cmd+"]"+#CRLF$+"VALEUR = ["+valeur+"]")

  Select cmd
    Case "A"
    Case "B"
    Case "T"
      cmd = Left(valeur,1)
      valeur_tmp = Mid(valeur,3,Len(valeur))
      valeur = valeur_tmp
      Goto again
    Case "S"
      MessageRequester("APPEL #"+Str(v),"STORE VAL["+valeur+"]")
    Default
      MessageRequester("ERROR","CMD = ["+cmd+"]"+#CRLF$+"VALEUR = ["+valeur+"]")
  EndSelect
EndProcedure

Procedure lance()

  For i = 0 To 3
    test_select(i)
  Next i

EndProcedure

lance()
si on enlève la ligne goto again, ca marche nickel, "GedB" m'a apporté la solution suivante (et la meilleure) :

Code : Tout sélectionner

;Global cmd.s, valeur.s, valeur_tmp.s, line.s

Procedure test_select(v.l)
Protected cmd.s, valeur.s, valeur_tmp.s, line.s

line = "T S A = 45"
cmd = Left(line,1)
valeur = Mid(line,3,Len(line)-3)

 
  Repeat
    Again = #False

    MessageRequester("APPEL #"+Str(v),"CMD = ["+cmd+"]"+#CRLF$+"VALEUR = ["+valeur+"]")
 
    Select cmd
      Case "A"
      Case "B"
      Case "T"
        cmd = Left(valeur,1)
        valeur_tmp = Mid(valeur,3,Len(valeur))
        valeur = valeur_tmp
        Again = #True
      Case "S"
        MessageRequester("APPEL #"+Str(v),"STORE VAL["+valeur+"]")
      Default
        MessageRequester("ERROR","CMD = ["+cmd+"]"+#CRLF$+"VALEUR = ["+valeur+"]")
    EndSelect
   
  Until Not Again
 
  EndProcedure

Procedure lance()

  For i = 0 To 3
    test_select(i)
  Next i

EndProcedure

lance() 

Publié : dim. 05/nov./2006 11:37
par flype2
Syntax
Break [Niveau]

Description

Break permet de quitter à n'importe quel moment une ou plusieurs des boucles suivantes: Repeat, For, ForEach et While. Le paramètre optionnel 'Niveau' indique le nombre de boucles qui doivent être abrégées. Sans paramètre, Break quitte la boucle courante.
Exemple: Boucle simple

For k=0 To 10
If k=5
Break ; Quitte immédiatement la boucle For/Next
EndIf
Debug k
Next

Exemple: Boucles imbriquées

For k=0 To 10
Counter = 0
Repeat
If k=5
Break 2 ; Quitte immédiatement les boucles Repeat/Until et For/Next
EndIf
Counter+1
Until Counter > 1
Debug k
Next


Syntax
Continue

Description

Continue permet de passer directement à la prochaine itération dans l'une des boucles suivantes: Repeat, For, ForEach et While.
Exemple:

For k=0 To 10
If k=5
Continue ; N'affichera pas 'Debug 5' car la fin de cette itération sera ignorée
EndIf
Debug k
Next
[EDIT]
j'avais pas vu la réponse de julien.

Publié : dim. 05/nov./2006 13:00
par SPH
Tiens, un flype2 !