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 ...
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.
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
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 !!
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

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.
J'ai fait du pas à pas sur ton code si simple qu'il en ai compliqué pour moi

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 ????
J'ai mal vu ou est-ce normal ???
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 !
et il vaut mieux utiliser "Break" comme te dit Julien

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 !