Sortie de plusieurs procedures ou de boucles.

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Sortie de plusieurs procedures ou de boucles.

Message 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
Dernière modification par Kwai chang caine le dim. 05/nov./2006 9:31, modifié 1 fois.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

If condition : goto SORTIE : EndIf

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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
Dernière modification par Flype le sam. 04/nov./2006 14:38, modifié 4 fois.
Image
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

tout à fait.
Image
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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. :)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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.
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
julien
Messages : 846
Inscription : ven. 30/janv./2004 15:06
Contact :

Message 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"
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Message 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() 
flype2
Messages : 9
Inscription : dim. 05/nov./2006 10:54
Localisation : France, Nantes

Message 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.
Image Image
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Message par SPH »

Tiens, un flype2 !

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Répondre