Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » [Basic Avancé] Boucles, fonctions sans sous-programme, Continue et Break.
Kikoodx Hors ligne Labélisateur Points: 2705 Défis: 11 Message

[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).


Lephenixnoir Hors ligne Administrateur Points: 20736 Défis: 143 Message

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 ?
Kikoodx Hors ligne Labélisateur Points: 2705 Défis: 11 Message

Citer : Posté le 03/02/2020 10:35 | #


Lephenixnoir a écrit :
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".
Protip
Ne me remerciez pas
Massena En ligne Rédacteur Points: 1892 Défis: 11 Message

Citer : Posté le 03/02/2020 18:16 | #


KikooDX a écrit :
Â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
Lephenixnoir Hors ligne Administrateur Points: 20736 Défis: 143 Message

Citer : Posté le 03/02/2020 18:23 | #


En effet, mon souci était que certains programmes s'entre-appellaient (Menu je pense à toi).

Ils ne devraient pas !
Massena En ligne Rédacteur Points: 1892 Défis: 11 Message

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
Lephenixnoir Hors ligne Administrateur Points: 20736 Défis: 143 Message

Citer : Posté le 03/02/2020 18:39 | #


Justifiable, oui. Mais tu pouvais t'en sortir à moindre frais en gardant les Prog
Massena En ligne Rédacteur Points: 1892 Défis: 11 Message

Citer : Posté le 03/02/2020 18:41 | #


Avec une erreur saut x)
Lephenixnoir Hors ligne Administrateur Points: 20736 Défis: 143 Message

Citer : Posté le 03/02/2020 18:41 | #


Non, sans bien sûr !
Massena En ligne Rédacteur Points: 1892 Défis: 11 Message

Citer : Posté le 03/02/2020 18:43 | #


Bah comment alors ?
Lephenixnoir Hors ligne Administrateur Points: 20736 Défis: 143 Message

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).
Massena En ligne Rédacteur Points: 1892 Défis: 11 Message

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 ^^'
Redcmd En ligne Membre Points: 306 Défis: 5 Message

Citer : Posté le 03/02/2020 20:05 | #


// We initialize Ans
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
This won't work in C.Basic
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
RedCMD#4299 - Discord
Mandelbrot SNKEmini Minesweeper Sudoku
Kikoodx Hors ligne Labélisateur Points: 2705 Défis: 11 Message

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
Protip
Ne me remerciez pas
Massena En ligne Rédacteur Points: 1892 Défis: 11 Message

Citer : Posté le 03/02/2020 20:56 | #


In C.Basic we don't have jump errors so... X)
Kikoodx Hors ligne Labélisateur Points: 2705 Défis: 11 Message

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).
Protip
Ne me remerciez pas
Redcmd En ligne Membre Points: 306 Défis: 5 Message

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
RedCMD#4299 - Discord
Mandelbrot SNKEmini Minesweeper Sudoku
Kikoodx Hors ligne Labélisateur Points: 2705 Défis: 11 Message

Citer : Posté le 04/02/2020 10:35 | #


Redcmd a écrit :
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).
Protip
Ne me remerciez pas
Lephenixnoir Hors ligne Administrateur Points: 20736 Défis: 143 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.

I almost never get errors, and when I do there's alway a way to fix it.

Then don't write this.

/!\ Mettre un appel de fonction dans un For par exemple est très instable. /!\

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.
Kikoodx Hors ligne Labélisateur Points: 2705 Défis: 11 Message

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.

Lephenixnoir a écrit :
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.
Protip
Ne me remerciez pas
Sentaro21 Hors ligne Membre Points: 862 Défis: 0 Message

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.
Je continue à développer C.Basic. (Il est compatible avec Basic Casio.)
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.

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v42 © créé par Neuronix et Muelsaco 2004 - 2021 | Il y a 90 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd