[Basic Avancé] Boucles, fonctions sans sous-programme, Continue et Break.
Posté le 03/02/2020 09:56
Âmes sensibles, s'abstenir, ce cours contient des labels
Bonjour
Dans ce cours vous allez apprendre comment fonctionnent les différentes boucles en Basic Casio (testé sur 35+e II), et comment utiliser leurs propriétés de façon intéressante.
Je considère que cette ressource est pointée vers les programmeurs confirmés en Basic Casio, et que ces méthodes doivent être utilisées en considération.
Commençons par expliquer les différences entre
For,
LpWhile et
While :
For : la calculatrice retient la position de
For, une fois arrivée au
Next elle vérifie si la condition du
For est vraie (i >= limite), si non elle saute au
For,
si oui elle continue après ce Next.
LpWhile : la calculatrice retient la position de
Do, une fois arrivée au
LpWhile elle vérifie si la condition est vraie, si oui elle saute au
Do correspondant,
si non elle continue après ce LpWhile.
While : la calculatrice retient la position de
While, une fois arrivée au
WhileEnd elle saute au
While, elle vérifie si la condition du
While est vraie, si oui elle continue après ce
While,
si non elle continue après le WhileEnd le plus proche.
Je vous recommande de relire plusieurs fois afin de bien saisir leurs différences.
On notera que le fonctionnement de
While diffère de
For et
LpWhile.
Commençons par le plus "simple" : Continue
Do
//Not Ans alterne entre 0 et 1 à chaque cycle
Not Ans
//Si Ans est vrai (!=0) on saute le reste de la boucle
Ans=>LpWhile 1
Locate 1,1,Ans
LpWhile 1
En plaçant ce
LpWhile intermédiaire, on émule le fonctionnement d'un Continue.
En effet, si
Ans est positif ce
Locate est sauté et la boucle repart du
Do.
Testez ce programme sur calculatrice, et vous verrez que seuls les 0 seront affichés.
Passons à un niveau au-dessus : Break
Le code commence à sentir les spaghetti, faute aux Labels mais on devrait s'en sortir.
//On initialise Ans
0
Do
//Incrémentation de Ans
Ans+1
//C'est notre Break ! On saute après la boucle si la condition est vraie, et skip le reste.
Ans=20=>Goto Z
Locate 1,1,Ans
LpWhile 1
//Ce Do est présent pour éviter les erreurs syntaxes
Do
Lbl Z
LpWhile 0
Relisez bien le code pour le comprendre. Si vous l'exécutez sur votre calculatrice, vous constaterez que le programme sautera l'affichage du 20 et s'arrêtera à 19.
Maintenant, accrochez vous, voici les fonctions ! Notez que cette méthode est plus instable et difficile à débugger que l'appel de sous-programmes.
//L'appel de fonction commence ici
1
While Ans
Goto 0
WhileEnd
//Il termine ici
//Un autre appel
2
While Ans
Goto 1
WhileEnd
//Et un autre
21
While Ans
Goto 0
WhileEnd
//Ce Stop est OBLIGATOIRE, ne l'oubliez surtout pas ! Il est nécessaire pour spécifier au programme de ne pas lire ce code
Stop
//Ces While vides sont présents pour éviter l'erreur syntaxe
While
Lbl 0
//Début de la fonction
For 1->A To 7
Locate Ans,A,0
Next
//Ce 0 permet de terminer la fonction, il est obligatoire et rend la condition du While Ans de l'appel fausse (vous n'êtes pas obligé d'utiliser Ans, mais je le recommande)
0
WhileEnd
//Une seconde fonction
While
Lbl 1
For 1->A To 7
Locate Ans,A,1
Next
0
WhileEnd
/!\ Mettre un appel de fonction dans un For par exemple est très instable. /!\
J'espère que vous aurez trouvé ce guide utile, de ce que je sais c'est la première fois que l'on parvient à appeler des fonctions d'une telle façon.
C'est une "nouveauté" importante à expliquer, et une bonne exploitation des mécaniques pétées du Basic Casio (je l'ai découvert hier soir).
Citer : Posté le 03/02/2020 10:21 | #
Intéressant ! Je suppose que l'instabilité quand tu appelles ça depuis un For c'est parce que la boucle ne se termine jamais ?
Citer : Posté le 03/02/2020 10:35 | #
Intéressant ! Je suppose que l'instabilité quand tu appelles ça depuis un For c'est parce que la boucle ne se termine jamais ?
Non, erreur syntaxe.
Implémenter tout ça a été bien galère, les Labels sont une torture. Ça doit être faisable, mais pas aussi "simplement".
Citer : Posté le 03/02/2020 18:16 | #
Âmes sensibles, s'abstenir, se cours contient des labels
Ça commence bien tiens
Si vous jetez un oeil au code de mon Picross, vous apercevez qu'il est divisé en labels.
En effet, mon souci était que certains programmes s'entre-appellaient (Menu je pense à toi).
Et, comme vous pouvez le constater, mes sauts de label sont assez lisible et ne provoquent pas d'erreur
Citer : Posté le 03/02/2020 18:23 | #
Ils ne devraient pas !
Citer : Posté le 03/02/2020 18:38 | #
Le menu In-Game proposait deux options incompatibles :
- Retour en jeu, avec un return()
- Retour au sélecteur de niveaux, auquel cas on est obligé de revenir sur le programme du menu principal et qui propose de relancer une partie, d'où on peut accéder à nouveau au menu in-game...
Je voulais conserver cette ergonomie sans provoquer d'erreur saut.
Je pense que mon choix est justifiable
Citer : Posté le 03/02/2020 18:39 | #
Justifiable, oui. Mais tu pouvais t'en sortir à moindre frais en gardant les Prog
Citer : Posté le 03/02/2020 18:41 | #
Avec une erreur saut x)
Citer : Posté le 03/02/2020 18:41 | #
Non, sans bien sûr !
Citer : Posté le 03/02/2020 18:43 | #
Bah comment alors ?
Citer : Posté le 03/02/2020 18:45 | #
Il "suffit" de Return en laissant une indication dans une variable (valeur de retour) pour indiquer s'il faut reproposer le menu ou s'il faut passer directement au sélecteur (avec en prime la valeur du niveau actuellement sélectionné par exemple).
Citer : Posté le 03/02/2020 18:47 | #
Aaah, pas con !
Je le saurais pour la prochaine fois, merci !
Je n'ai pas le courage de reprogrammer mon picross ^^'
Citer : Posté le 03/02/2020 20:05 | #
0
Do
// Increment of Ans
Ans + 1
// This is our Break! We jump after the loop if the condition is true, and skip the rest.
If Ans = 20 => Goto Z
Locate 1,1, Ans
LpWhile 1
// This Do is present to avoid syntax errors
Do
Lbl Z
LpWhile 0
All loops have to be defined at compile time and can't move around
Also the If causes a syntax error If Ans = 20 => Goto Z
Citer : Posté le 03/02/2020 20:51 | #
I don't really care about C.Basic compability
I fixed the condition, I forgot to remove the If thank you
Citer : Posté le 03/02/2020 20:56 | #
In C.Basic we don't have jump errors so... X)
Citer : Posté le 04/02/2020 08:37 | #
You would be surprised, my projects tend to get more Goto Error in C.Basic than Basic Casio (also, the issue is Syntax Error in that case).
Citer : Posté le 04/02/2020 10:25 | #
Huh..
I almost never get goto errors (or syntax errors cause of goto)
I've learnt not to jump out of while/for loops (which you can do with goto loops)
and always put the end " on locate, text and str commands
Citer : Posté le 04/02/2020 10:35 | #
Huh..
I almost never get goto errors (or syntax errors cause of goto)
I've learnt not to jump out of while/for loops (which you can do with goto loops)
and always put the end " on locate, text and str commands
You learned a lot of bad things, Goto loops sucks (they are slow, buggy and hard to read).
Jumping out of loops is possible, while not recommanded (this is what this topic is all about).
I don't know why you bring it here but the " optimisation can be done in a consistent way if you know how it works.
I almost never get errors, and when I do there's alway a way to fix it.
The Goto Error in C.Basic come from a program call, there isn't a single label in it (stupid error message).
Citer : Posté le 04/02/2020 11:48 | #
Hey KikooDX, don't be too rash please. Judging people's practices and skills instead of explaining why your techniques shine looks very condescending. Your point is probably correct, but the way you discuss is probably wrong.
That jumping out of loops is buggy in Basic Casio is due to a very naive, scope-unaware implementation of Goto. Just like how you can jump into a string (which is even worse by the way because it is unaware not only of scope, which is syntactical, but also of strings, which are lexical!). Jumping out of loops does make sense because Break is exactly that. Mind what is related to programming concepts and what is related to Basic Casio being half-useless.
Then don't write this.
Also if you have Goto errors in C.Basic then either there are bugs in the implementation of C.Basic or you're just not proficient enough to write correct C.Basic on the first try. None of these is a good reason to be so rash. You may not like C.Basic, and you don't need to have arguments to dislike it. But if you want to bring out arguments, please do it right.
Citer : Posté le 04/02/2020 12:00 | #
Sorry, I don't always think much when I write (especially in english)
I don't want to be condescendant in any way, I just react to the "Huh... I almost never get goto errors" of RedCMD (in a bad way probably).
That first quote doesn't make sense indeed, what I wanted to point out is even if the Basic Casio is broken it is predictable.
The second one is still on the way, this article is more a proof-of-concept than anything else. I still recommand using Prgm for functions.
Also if you have Goto errors in C.Basic then either there are bugs in the implementation of C.Basic or you're just not proficient enough to write correct C.Basic on the first try. None of these is a good reason to be so rash. You may not like C.Basic, and you don't need to have arguments to dislike it. But if you want to bring out arguments, please do it right.
That's my main problem with C.Basic, I don't know if I did it wrong or if C.Basic just doesn't understand it.
I'm for sure not efficient in C.Basic, since I gave up it's new features 3 days after I started.
I do like C.Basic, it's a great project, I just don't think C.Basic and Basic Casio have to work together.
That's why I don't like stuff like "it don't work in Basic, try C.Basic".
I use it for debugging purpous on projects that works with it (Isaac for generation i.e.), and I think porting a Basic project to C.Basic once the said project is completed is a great idea.
Citer : Posté le 04/02/2020 12:45 | #
Sorry for bugs remaining in C.Basic.
Goto command of Basic Casio is complicated and slow, so it is difficult to implement it with the same specifications.
However, I will fix what I can fix.
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.