Page 1 sur 1

Différence en Break et Goto dans une procédure.

Publié : ven. 20/mars/2026 12:14
par Francois
Bonjour à tou(te)s,

Code : Tout sélectionner

Structure VOITURE
  Marque.s
  Model.s
EndStructure

Procedure Ford()
  Static MaVoiture.VOITURE
  
  MaVoiture\Marque = "Ford"
  MaVoiture\Model  = "Mondeo"
  
  hWnd_InputBox = OpenWindow(#PB_Any, 0, 0, 300, 200, "Ma bagnole.", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break;Goto FinDeLaProcedure
    EndSelect
  ForEver  
  
  FinDeLaProcedure:
  ProcedureReturn @MaVoiture
EndProcedure

*QuelleEstMaVoiture.VOITURE = Ford()
Debug *QuelleEstMaVoiture\Marque
Debug *QuelleEstMaVoiture\Model


Tout fonctionne, la structure est bien retournée au programme principal lorsque je ferme la fenêtre.
Mais si sur la ligne 17, je remplace le Break par un Goto, le programme plante sur la ligne 22 avec l'erreur :
Accès mémoire invalide. (erreur d'écriture à l'adresse 0)

Pouvez-vous m'expliquer la raison de mon problème ? Je reconnais que le goto n'est pas joli, mais en réalité dans le vrai code, j'ai toute une gestion d'erreur d'où l'utilisation d'une étiquette pour sortir de la procédure.

Un grand merci par avance.

F.R.

Re: Différence en Break et Goto dans une procédure.

Publié : ven. 20/mars/2026 12:46
par Itsy Bitsy
Bonjour,

Ce n'est qu'un problème de pile.

A la fin de ce post :

viewtopic.php?p=217822#p217822

Lorsqu'on connait ce problème, on utilise des if, car on sait que les goto/break/continu fonctionnent sans problèmes.

Re: Différence en Break et Goto dans une procédure.

Publié : ven. 20/mars/2026 15:11
par MLD
Bonjour
Mettre un Goto ou des Goto (s) dans une boucle. Cela s'appel un programme spaghetti.
Le meilleur moyen de planter un programme, et s'il a de nombreuses lignes de le rendre difficilement débugable.
A toi de voir

Re: Différence en Break et Goto dans une procédure.

Publié : ven. 20/mars/2026 15:17
par SPH
Perso, j'utilise les Goto et les Gosub.

L'avantage d'un Goto, c'est qu'il saute à une étiquette à coup sûr.
En revanche, un Break sort d'une "boucle" mais si tu a après coup rajouté une boucle, le Break se plantera si tu ne le corrige pas en Break 2.

PS : j'aime les films spaguetti :)

PS2 : un code assembleur contient des milliers de goto :idea:

Re: Différence en Break et Goto dans une procédure.

Publié : ven. 20/mars/2026 15:41
par SPH
PS3 : rien ne t'empêche d'utiliser les 2 méthodes selon la routine sur laquelle tu bosses :mrgreen:

Re: Différence en Break et Goto dans une procédure.

Publié : ven. 20/mars/2026 16:13
par Francois
Un grand merci pour vos réponses. Effectivement, je n’avais pas remarqué la note dans la documentation sur l’usage du goto :
Note : Pour sortir d’une boucle en toute sécurité, vous devez toujours utiliser Break à la place de Goto et ne l’utilisez pas dans un bloc Select/EndSelect, à moins que vous ayez les aptitudes nécessaires pour gérer la pile vous-même.


Bon, il me faut maintenant mettre mon programme au régime « sans spaghetti » et trouver une structure plus adaptée dans ma gestion des codes d’erreurs retournés par une procédure.

En tout cas, un grand merci à vous tous, car je séchais depuis 3 jours sur ce problème que j’ai eu beaucoup de mal à isoler.

F.R.

Re: Différence en Break et Goto dans une procédure.

Publié : ven. 20/mars/2026 16:44
par Mindphazer
Sinon, sans Break ni goto :

Code : Tout sélectionner

Structure VOITURE
  Marque.s
  Model.s
EndStructure

Procedure Ford()
  Static MaVoiture.VOITURE
  
  MaVoiture\Marque = "Ford"
  MaVoiture\Model  = "Mondeo"
  
  hWnd_InputBox = OpenWindow(#PB_Any, 0, 0, 300, 200, "Ma bagnole.", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        ProcedureReturn @MaVoiture
    EndSelect
  ForEver  
EndProcedure

*QuelleEstMaVoiture.VOITURE = Ford()
Debug *QuelleEstMaVoiture\Marque
Debug *QuelleEstMaVoiture\Model

Re: Différence en Break et Goto dans une procédure.

Publié : ven. 20/mars/2026 17:37
par Francois
C'est ce que j'ai commencé à faire pour une partie de mon code :

Code : Tout sélectionner

Structure VOITURE
  Marque.s
  Model.s
EndStructure

Procedure Criteres(MonChoix.s)
  Static MaVoiture.VOITURE
  
  Select MonChoix
    Case "Ford"
      MaVoiture\Marque = "Ford"
      MaVoiture\Model  = "Mustang"
      ProcedureReturn @MaVoiture
    Case "Renault"
      MaVoiture\Marque = "Renault"
      MaVoiture\Model  = "Clio"
      ProcedureReturn @MaVoiture
  EndSelect
        
EndProcedure

*MonChoix.VOITURE = Criteres("Ford")
Debug *MonChoix\Marque
Debug *MonChoix\Model
Pour une autre partie je devrais utiliser les boucles while pour chaque bloc de test ce qui alourdi un peu le programme :

Code : Tout sélectionner

CodeErreur = 0
While CodeErreur <> -1
  ...
  CodeErreur = -1
Wend
...
While CodeErreur <> -1
  ...
  CodeErreur = -1
Wend
F.R.

Re: Différence en Break et Goto dans une procédure.

Publié : sam. 21/mars/2026 7:18
par Kwai chang caine
Ou la la... GOTO... et encore pire... GOSUB 8O
ça me rappelle mes milliers d'heures de prog en QBasic donc sous DOS... Pas de fenêtres 8O ... Ça me rajeunit pas :oops:
En fin de compte... de l'assembleur mais sans la puissance et la rapidité :mrgreen: alors là on est dans la prog séquentielle ou j'm'y connait pas :lol:

Faut dire que comprendre ce qu'était une procedure ou fonction, je me rappelle plus, qui quand on voulait la lire faisait disparaître tout le reste du code, comme y'avait pas de fenetres 8O j'en ai donc jamais utilisé de peur de perdre mon précieux code, déjà que les sauvegardes étaient parfois du sport à cette époque :lol:
En 25 ans de PB, j'ai compris ce qu'était une procédure :mrgreen: et je n'utilise les goto que lorsque provisoirement je teste un code et que je veux sauter quelques appels de procedures grace à la valeur d'un paramètre en debut de programme, plutot que de les commenter/decommenter

Donc en temps que spécialiste officiel du bug en PB, je crois que je les ai tous testés :mrgreen: enfin je croyais jusqu'à aujourd'hui car sortr d'une boucle avec un GOTO ça me serait jamais venu à l'idée 8O
Par contre sortir direcr d'une boucle avec un procedureretrun.. Je sais que y'en a qui disent que c'est pas bien et pas pro (donc pour moi :mrgreen:) , mais FRED avait dit il y a un grand nombre d'années qu'il avait prévu le truc en ASM et que ça posait techniquement pas de problème 8)