Forum

Catégorie : Support
Forum : TI-82 STATS.fr
Vues : 3374
Réponses : 19
Type : discussion
Etat : réponses autorisées

Goto ou quitter

Vavas le 14/06/2012 à 11:49
Bonjour.

Lorsqu'une boucle est en cours entre un lbl et un goto, comment faire en sorte qu'avec une précision de 2nd et mode (quitter) le programme se quitte.
Car l'arrêt avec ON est un peu.. moyen.
Vavas le 14/06/2012 à 11:50
préssion*
sandro le 14/06/2012 à 11:59
Tu rajoute en première ligne du programme un 0 -> L
puis juste après le Lbl tu rajoute:
Code
CodeTouch -> K
If K=21
non(L -> L
If KL=22
Stop


ça devrait marcher
Stop est dans le menu prgm/ctl ; CodeTouch dans le menu prgm/ E/S ; non( dans le menu test/logique

Sandro
Persalteas le 14/06/2012 à 13:29
ce serait pas K+L plutôt que KL ?
F-BVXT le 14/06/2012 à 18:02
Non, il me semble que c'est bien KL puisque le but est d'appuyer sur 2nde puis mode (quitter). Par contre, avec ça, je crois qu'à partir du moment ou il aura appuyé une seule fois sur 2nde, il n'aura plus qu'à appuyer sur mode même si ce n'est pas la touche appuyée immédiatement après.

Je propose donc ça :
Code
CodeTouch -> K
If K=21
non(L -> L
If KL=22
Stop
If min(K[différent de]{21,22
EffVar L
Persalteas le 14/06/2012 à 19:29
Ah non ! là, ta ligne de code elle sert a rien puisque le programme s'arrête avant de l'avoir lue !

Code
CodeTouch -> K
If K=21
non(L -> L
If min(K[différent de]{21,22
EffVar L
If KL=22
Stop


Dans ce cas, OK.
The K le 14/06/2012 à 20:49
Il y a aussi la méthode simple : tu quittes pas.

Parce qu'à l'origine c'est pas prévu pour xD
F-BVXT le 14/06/2012 à 21:56
Citation
Ah non ! là, ta ligne de code elle sert a rien puisque le programme s'arrête avant de l'avoir lue !


Je comprend pas bien ce que tu veux dire, parce que si K=21, alors le programme ne va pas s'arrêter (KL=21). Ensuite, dans le deuxième tour de boucle, si K=22 alors KL=22 et donc le programme s'arrête. Par contre s'il réappuie sur 2nde, rien ne va se passer mais s'il appuie sur une autre touche, il faudra recommencer l'opération (2nde puis quitter), non ?

Du coup, c'est vrai qu'avec ce raisonnement on peut supprimer le If K [différent de 22] :

Code
CodeTouch -> K
If K=21
non(L -> L
If KL=22
Stop
If K-21
EffVar L
Persalteas le 15/06/2012 à 09:41
Ben... si !

Si il appuie une fois sur la touche [2nde], puis, beaucoup plus tard, peut être en ayant pressé d'autres touches avant, il appuie sur [mode], ça quittera...
F-BVXT le 15/06/2012 à 10:43
Bon, cet fois ci j'ai essayé et ça ne marche que s'il appuie sur 2nde et que la touche pressé après est mode (quitter) :
Code

EffVar L
LBL 0
CodeTouche -> K
If K=21
non(L -> L
If KL=22
Stop
If min(K[différent de]{0,21
EffVar L
Goto 0
linkakro le 16/06/2012 à 16:39
Je trouve cela bien compliqué (à première vue, sans certitude), je pense qu'il suffirait d'une variable intermédiaire.
Et pour cela on a pas forcément besoin d'utiliser la commande non().
Code
DelVar L
Repeat L=21 and K=22
If K
K->L
getKey->K
End
"OK
EDIT: j'ai ajoûté le If K
Persalteas le 16/06/2012 à 17:50
clown.gif Waw

:pwned:
F-BVXT le 16/06/2012 à 18:26
Je ne dirai qu'une chose.
linkakro le 16/06/2012 à 21:10
Je viens de remarquer que mon code est faux lui aussi ! frozen.gif
En effet il faudrait appuyer sur les touches plus vite que la lecture du programme.
J'ai édité mon message précédent en réglant ce problème.

De façon secondaire, remarquons que cette méthode ne permet pas d'avoir plusieurs sorties différentes. Il faudrait donc utiliser d'autres types boucles et sûrement des goto.
Je pense à :
Code
Lbl 0
...
If K
K->L
getKey->K
...
If K=22 and L=21
Goto 1
If K=... and L=...
Goto 2
...
Goto 0

Lbl 1
...
Goto 3
Lbl 2
...
Lbl 3
Ici le Lbl 0 pourrait être un While 1, seulement je me méfie du conflit goto/end.
F-BVXT le 16/06/2012 à 21:51
Certes, mais le sujet original c'était d'arrêter le programme avec la touche quitter entre un LBL et un Goto donc c'est tout simplement :
Code
Lbl 0
If K
K->L
codeTouche->K
If K=22 et L=21
Goto 0


Citation
Ici le Lbl 0 pourrait être un While 1, seulement je me méfie du conflit goto/end.

Je ne vois pas de quel conflit tu parles, il suffit de mettre un End au début de chaque LBL vers lesquels nous renvoie les Goto compris dans la boucle, non ?
Code
While 1      //ou Repeat 0
...
If K
K->L
getKey->K
...
If K=22 and L=21
Goto 1
If K=... and L=...
Goto 2
...
End

Lbl 1
End
...
Goto 3
Lbl 2
End
...
Lbl 3


Ah, et sinon: "..."
The K le 16/06/2012 à 22:38
Vous me faites plaisir avec vos "If K" ^^

Bon sinon je vous signale que vous êtes en train de discuter d'un morceau de code plutôt inutile et dont l'auteur (enfin celui qui l'a demandé) ne donne plus suite.

Voilà, post K-rrément inutile du jour winkle.gif
F-BVXT le 16/06/2012 à 22:42
Enfin, peut-être qu'il va répondre parce que ça fait que 2 jours qu'il a posté donc on sait jamais... même si tu as probablement raison. cry.gif
linkakro le 16/06/2012 à 22:55
Ce que tu viens d'écrire empêche de lire le contenu des Lbl ! (par un retour au début) C'est précisément le conflit dont je parle.
https://tout82.pages-perso.fre[...].php?sujet=2757

Cependant tu viens de soulever quelque chose de très intéressant, sans le savoir.
Voir le chapitre suivant du tutoriel de mdr1 sur le sdz : https://web.archive.org/web/20[...]ec-les-end.html
Si les séquences se terminent par un retour au début, on peut exploiter volontairement le bug.
Code
While 1
...
If K
K->L
getKey->K
...
If K=22 and L=21
Goto 1
If K=... and L=...
Goto 2
...
End
Lbl 1
...
End // retour au début !
Lbl 2
...
End // retour au début !
The K le 16/06/2012 à 23:02
Mouais ... T'as pas tort.
Mais ça marche pas toujours. J'ai essayé avec un End conditionnel une fois ça a pas marche sad.gif
F-BVXT le 16/06/2012 à 23:11
Ah oui autant pour moi il faut dans ce cas ne pas mettre While 1 mais While I par exemple et faire EffVar I au début de chaque LBL.