19Fermer21
gon33Le 08/07/2008 à 15:45
[nosmile]
Bah, le second et le premier ça revient à la même chose...

C'est pour faire l'équivalent d'un "call" Asm:

Si je fais un Goto classique:

:Code1
:If condition: Goto A
:Code2
:Lbl A
:Sous-prog
:Disp "lol"


Le programme affiche "lol" alors que l'on veut revenir à Code2.

Avec un Goto double:

:Code1
:If condition: Goto A
:Lbl B
:Code2
:Lbl A
:Sous-prog
:Goto B
:Disp "lol"


Effectivement ça marche, mais que ce passe-t-il quand tu as besoin de ce sous prog à plusieurs endroits?

Pour chacun des appels, il faudrait faire un label (hyper lent, et long)

:Code1
:1=>K
:If condition1: Goto A
:Lbl B
:Code2
:
:2=>K
:If condition2: Goto A
:Lbl C
:Code2
:
:Lbl A
:Sous-prog
:If K=1:Goto A
:If K=2:Goto B
:Disp "lol"


Ici, le temps d'exécution et la longueur du code sont proportionnels au nombre d'appels du sous programme...

Maintenant, le code que je te propose est différent.
Quel que soit l'endroit d'où on l'appelle, il revient au bon endroit tout seul, et sans Goto, grâce à la boucle.


:Code1
:If condition1
:Then
:For(L,-1,0:If L:Goto S:End
:End
:
:Code2
:If condition2
:Then
:For(L,-1,0:If L:Goto S:End
:End
:
:Stop
:Lbl S
:Sous-prog
:End
:
:Eventuel sous-prog2




Baruch (./9) :
Recherche par dichotomie


Attention, si tu fais ça, ton code va planter (sauf chance).
Par exemple:

:While X = 45
:Code
:1=>A
:Goto A
:Lbl B
:45=>X
:End
:Disp "Lol"
:End
:
:Lbl A
:If A=1
:Then
:Goto B
:Else
:Goto C
:End


Ce code ne marche pas: il affiche "lol" à l'écran.
En effet, l'exécution ne rencontre jamais le dernier "End", car elle remonte au label B avant. Résultat, elle confond le premier End avec le second et "pense" que le if est finit quand elle le rencontre. Ce n'est que quand elle a affiché lol qu'elle termine le While.
Donc, il ne faut jamais mettre un Goto dans une boucle... (sauf exceptions)

D'ailleurs, la dichotomie c'est pas ça. Ce serait plutot:
(genre, j'ai A entre 1 et 4)

:If A<3
:Then
:if A<2
:Then
:Disp "A=1"
:Else
:Disp "A=2"
:End
:Else
:If A<4
:Then
:Disp "A=3"
:Else
:Disp "A=4"
:End
:End


Et voilà le lien tout beau^^
C'est une mine d'infos ce fichier, vous devriez le lire...
http://www.ticalc.org/archives/files/fileinfo/145/14542.html