Sortie de plusieurs procedures ou de boucles.
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Sortie de plusieurs procedures ou de boucles.
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
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
Dernière modification par Kwai chang caine le dim. 05/nov./2006 9:31, modifié 1 fois.
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
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 :
Bon je te remercie de l'info qui etait tellement simple que je n'osais pas le faire.
Excelente journée à toi.
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.
La vieille école quoi...
On peut tout aussi bien y arriver et plus proprement en construisant des procédures récursives bien pensées
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
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
Dernière modification par Flype le sam. 04/nov./2006 14:38, modifié 4 fois.
surtout pas !!SPH a écrit :If condition : goto SORTIE : EndIf

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
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
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.
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


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.

- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
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
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)
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()
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()
[EDIT]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
j'avais pas vu la réponse de julien.