Explication
Pour faire ce type de boucles, nous avons besoin de deux instructions, en fait :
- Goto : [PRGM] + CTL + 0
- Lbl : [PRGM] + CTL + 9
Le principe de ces instructions est très simple : elles marchent par paires.
Un Goto permet de passer directement à la ligne d'instruction d'un Label.
Mais si on a plusieurs Goto et Labels, comment fait-on pour les différencier ?
C'est très simple : chaque
Goto et
Label doit être associé à un
indice (un chiffre allant de
0 à 99 ou une lettre allant de
A à Z + le têta).
Voilà la syntaxe :
Code : Pascal1
2 | :Lbl [indice]
:Goto [indice]
|
Par exemple :
Code : Pascal
Mais je crois que le mieux est de sortir un joli schéma pour expliquer tout ça !
Commentons ce code point par point :
- le programme commence
- Le code situé en A est exécuté
- On rencontre le goto 1 qui nous emmène au label 1 (flèche verte)
- D est exécuté
- On rencontre le goto 2 qui nous emmène au label 2 (flèche rouge)
- C est exécuté
- On rencontre le goto 3 qui nous emmène au label 3 (flèche rouge)
- Le programme se termine
Exemple
Un premier exemple concret : comment sortir d'une boucle
While en plein milieu ? ... Avec un
Goto, bien sûr !
Code : Pascal 1
2
3
4
5
6
7
8
9
10 | :0->A
:While 1 // une boucle infinie ! A bannir ou à utiliser avec précaution
:Disp "COUCOU"
:If A=4:Goto 1
:Disp "COUCOU 2"
:A+1->A
:End
:Lbl 1
:Disp "FIN"
:Output(1,1,"
|
Quand A est égal à 4, alors on sort de la boucle pour aller jusqu'au label 1. le "COUCOU 2" ne s'affiche pas, mais le texte "FIN" s'affiche !
Contre-exemple
Même si les
Goto peuvent sembler très pratiques, je vous conseille d'abord de vous habituer à utiliser les
While, qui sont souvent moins lourds.
Code : Pascal 1
2
3
4
5
6
7
8
9
10
11 | :Lbl A
:Disp "TEST"
:If A=B:Goto B
:Goto A
:Lbl B
:Disp "FIN"
// Ce code équivaut à celui-ci !
:Repeat A = B
:Disp "TEST"
:End
:Disp "FIN"
|
La sentence est sans appel ! Le
Repeat est plus pratique, plus lisible et moins lourd !
Les Goto sont donc à utiliser avec parcimonie. Très pratiques sur des gros programmes, ils peuvent parfois fabriquer de gros bugs difficilement détectables (oubli d'un label, mauvais indice,...)