π
<-
Chat plein-écran
[^]

Les questions d'un débutant en Lua

Pour TI-Nspire OS 3.0 ou ultérieur.

Les questions d'un débutant en Lua

Message non lude Fubuki » 26 Oct 2015, 12:23

Salut à tous
Je ssouhaite utiliser le Lua pour faire quelques programmes sur ma calculette afin d'optimiser l'utilisation de mon temps pendant les contrôles, j'ai donc commencé mon apprentissage avec le site inspired-lua.org en suivant les cours de Steve Arnold, cependant, il y a pas mal de choses qui me perturbent dès la leçon 4, je vais donc poster sur ce topic les différentes questions que je pourrais me poser au fil des cours, et je rajouterait les réponses aux questions sur ce post au fur et a mesure, de sorte que si quelqu'un suit le même chemin, il puisse trouver toutes les réponses au même endroit :)
j'espère qu'une bonne partie de la communauté participera à ce topic afin de le compléter au plus vite pour les prochains aprentis programmeur, et j’essaierai aussi de répondre aux questions qui seront posée (dans la limite de mes compétences ^^ ) :D

Fubuki

-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-

Voici donc les questions et leurs réponses

:help:°1 Pourquoi les fonctions ne s'éxécutent-elles pas dans l'ordre où elle sont écrite ? (autrement dit, pourquoi, un programme fonctionne-t'il de la même manière peu si on change les positions des fonctions ??) il y a t-il des fonctions prioritaires ???
:48tinscx: Le lua est un langage évenementiel, lorsqu'un évènement se produit (par éxemple une entrée clavier), le programme va chercher dans tout le code source si il y a une fonction qui prend en compte cette évènement et éxécuter toutes les instructions qui y sont comprises.

:help:°2 A quoi sert le quatrième paramètre d'une instruction drawString ?
:48tinscx: Ce quatrième paramètre permet de modifier le point d'ancrage de la chaîne déssinée, il n'est pas obligatoire, il possible de mettre "baseline", “bottom”, “middle” ou encore “top”, bien que ce paramètre soit relativement inutile.

:help:°3 lorsque l'on appel une seconde fonction onPaint, ce qui a été affiché précédemment est effacé, pourquoi ?
:48tinscx: Tout d'abord, il faut savoir qu'une fonction est en fait une variable. lors du lancment du programme, une première lecture est faite de haut en bas de sorte que le programme connaisse toute les fonction, ensuite lorsqu'un évènement appelera une fonction, le code ne sera pas relu entièrement, puisque les fonctions sont connues, donc le programme ira chercher ce qu'il a lu en mémoire.
Or, comme une fonction est une variable, le fait de définir deux fois une fonction revient à faire a=1 puis a=2, en mémoire, a vaudra 2 et le a=1 sera comme innéxistant. il est donc "interdit" d'avoir deux fois la même fonction dans un programme, bien que cela ne fasse pas d'erreur puisqu'il y a un anti-bêtise qui va considérer uniquement la dernière déclaration de cette fonction, le seul problème sera donc que l'on prend de la place en mémoire pour rien.

:help:°4 comment afficher une entrée clavier dans une phrase seulement après que l'on ai fini d'écrire ??
:48tinscx: dans ce cas, donner le code complet avec les explications à côté est plus simple :

Code: Tout sélectionner
local screen = platform.window
local answer = ""
local displayAnswer -- Comme on atribue pas de valeur à la variable, elle sera automatiquement initialisée à nil.

function on.enterKey() -- On choisit la touche entrer pour dire qu'on a fini.
    displayAnswer = true -- Quand on appui sur entrer, la fonction on.enterKey est appelée, elle fait passer la variable displayAnswer de nil à true.
    screen: invalidate() -- On demande un raffraichissement de l'écran.
end


function on.charIn(char)
    if not displayAnswer then -- Tant que displayAnswer n'a pas de valeur, on peut continuer à écrire.
        answer = answer..char
        screen:invalidate()
    end
end

function on.backspaceKey()
     answer = answer:usub(0,-2)
     screen:invalidate()
end

function on.paint(gc)
    gc:drawString("Comment vous appelez vous ?? : ", 0, 20)
    gc:drawString(""..answer, 225, 20)
    if displayAnswer then -- Si displayAnswer renvoi true, alors on éxécute ce qui suit.
        gc:drawString("Oh ! Vous êtes donc "..answer.." ! Anchanté monsieur !", 0, 40)
    end
end


détails des questions et des réponses 1 à 4 : viewtopic.php?f=19&t=17460&p=191325#p191296 et viewtopic.php?f=19&t=17460&p=191325#p191301, merci à @technolapin
Dernière édition par Fubuki le 26 Oct 2015, 18:28, édité 1 fois.
Avatar de l’utilisateur
Fubuki
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 26.7%
 
Messages: 5
Inscription: 26 Oct 2015, 11:42
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Les questions d'un débutant en Lua

Message non lude Fubuki » 26 Oct 2015, 13:34

Voici donc mes premières questions (oui il y en a plusieurs, autant qu'il y a de choses qui me perturbent en fait ^^), c'est à propos de la saisie de texte (leçon 4), voici le code
Code: Tout sélectionner
screen = platform.window
answer = ""

function on.charIn(char)
     answer = answer..char
     screen:invalidate()
end

function on.paint(gc)
    gc:drawString(answer, 0, 20)
end

function on.backspaceKey()
     answer = answer:usub(0,-2)
     screen:invalidate()
end

ca fonctionne parfaitement, cependant, quand j'essai dafficher une question d'abord, puis de demander la réponse, la question ne s'affiche pas :/
Code: Tout sélectionner
screen = platform.window
answer = ""
function on.paint(gc)
    gc:drawString("quel est votre nom ?", 0, 20)
end

function on.charIn(char)
     answer = answer..char
     screen:invalidate()
end

function on.paint(gc)
    gc:drawString(answer, 0, 40)
end

function on.backspaceKey()
     answer = answer:usub(0,-2)
     screen:invalidate()
end

j'ai donc fusionné le les 2 fonctions on.paint et là ça a fonctionné :#fou#: j'ai ensuite inversé les deux lignes drawString et là le résultat était le même, et même en changeant les positions des fonctions il n'y avait aucune érreur :o
c'est génial, l'ordre dans lequelon fait appel aux fonctions n'est plus une contrainte contrairement à certains langages :D mais cela laisse de nouvelles questions sans réponses :

:help: questions 1 : comment ce fait t'il que si on met les fonctions dans l'ordre on.charIn, on.paint, on.backspaceKey par éxemple, le programme n'attende pas une entrée clavier, puis il affiche, puis il efface un caractère ? la fonction on.paint est-elle prioritaire ?? (je ne m'en plaint pas du tout, au contraire même, je voudrais juste comprendre ce qui ce passe)

:help: question 2 : si on regarde le cour traduit en français ("comment avoir une petite fonction input bien sympa en lua...") on voit à la fin du drawString "top" en 4eme paramètre, qu'est-ce que c'est ? je ne vois aucun changement en l'enlevant

:idea: question 3 : d'après mes petites expériences, appeler une seconde fonction onPaint éfface tout ce qui a été écrit par la première, une sorte de clearScreen ??

:help: question 4 : donc il est en quelque sorte interdit d'avoir plusieurs fois la même fonction ?? mais alors si je veux avoir une ligne
gc:drawString("Oh, vous vous appelez donc"..input, 50, 50)
qui ne s'affiche qu'après qu'on ait fini d'écrire son nom, je fait comment ? je devrait indiquer de quelle manière que j'ai fini ma saisie ?

voilà, pas mal de question, avec des réponses sans doute simple, mais au moins elle sont posée ^^

Merci, Fubuki
Avatar de l’utilisateur
Fubuki
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 26.7%
 
Messages: 5
Inscription: 26 Oct 2015, 11:42
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Les questions d'un débutant en Lua

Message non lude technolapin » 26 Oct 2015, 14:50

1)
Le Nspire-lua, contrairement au basic, est un langage événementiel.
C'est-à dire qu'il se base sur des fonctions précises appelées par une action précise. Ces fonctions sont déclarées dans ton code.
Par exemple la fonction on.charIn est appelée lorsque l'on entre un caractère. C'est un seul événement alors il n'y a qu'une fonction on.charIn.
Si tu a déclaré on.charIn donc, le lua va check si tu entre un caractère à une fréquence assez élevée pour répondre quasiment immédiatement.
on.paint est aussi une fonction unique.
Définir cette fonction ne va pas dessiner sur l'écran immédiatement, elle sera appelée par le lua lorsqu'il va refresh l'écran, c'est une nuance importante à retenir.
On peut dire au lua "là faut redessiner l'écran" avec platform.window: invalidate () mais cela ne se fera pas non plus immédiatement, il faudra attendre que ce soit au tour du on.paint d'être check (ce qui se faire vachement rapidement quand même). Il n'y a donc pas de fonctions prioritaires.

2)
le 4e paramètre que tu peut entrer dans le on.char ("top" par exemple) permet de dire par quel coté du dessine ta chaîne (si je me souvient bien il y a "baseline", “bottom”, “middle” et “top” mais je sais plus trop). Ça sert pas trop je trouve.

3) -- pour cette réponse je suis un peu partis dans tous les sens :p
Lors que tu lance ton programme, le code va s'exécuter dans un premier temps de haut en bas, ce qui permet de déclarer tes variables (les fonctions sont des variables aussi)
par exemple
Code: Tout sélectionner
a = 1
function lol ()
  --code de ta fonction
end

Ici le lua va comprendre que une variable du nom "a" contenant un nombre existe ainsi qu'une variable lol contenant une fonction.
Remarque que
Code: Tout sélectionner
function lol ()
  --code
end

revient à écrire
Code: Tout sélectionner
lol = function ()
  --code
end

Ça marche aussi et ça permet de mieux comprendre au début que les fonctions ne sont que des variables comme les autres.

Or dans ton premier code, tu définit deux fois le on.paint
Voilà donc ce qui se passe.
Code: Tout sélectionner
function on.paint (gc)
  --code1
end
       -- une variable du nom on.paint contenant une fonction a été créée
function on.paint (gc)
  --code2
end
       -- une variable du nom on.paint contient maintenant une autre fonction remplaçant la précédente

C'est comme faire:
Code: Tout sélectionner
a = 1
a = 2


C'est pour ça que ton code d'origine avait des problèmes, tu avais bien une fonction on.paint mais qui ne contenait que le code de la deuxième.
(rappel: la fonction on.paint ne s'exécute pas quand tu la définit mais quand le lua l'appellera à son tour d’exécution)

4)
Tu ne peut avoir qu'une fonction on.paint donc, mais cela n’empêche pas ce que tu veux faire.
Tu peut par exemple définir une variable du genre "displayAnswer" qui serait par défaut à false ou à nil et qui prend la valeur true quand tu a finit d'entrer ton nom. Il suffirait de dire avec un if de ne dessiner la réponse que si displayAnswer est à true.

Je te mâche un peu le travail:

Code: Tout sélectionner
local screen = platform.window     -- le "local" permet de dire que ces variables sont locales et ne peuvent pas êtres utilisées par des fonction extérieures (plus rapide même s'il n'y a pas de fonction extérieures vu qu'elles sont définies à la base du programme
local answer = ""
local displayAnswer   -- la variable est définie même si on ne lui attribue pas de valeur. Elle sera donc à nil.
function on.enterKey ()   -- faut bien dire quand tu a finis d'écrire ton nom, j'ai donc dis que tu appuie sur enter pour valider
    displayAnswer = true
    screen: invalidate()
end
function on.charIn(char)
    if not displayAnswer then      -- là je dit que quand tu peut écrire que quand tu n'as pas validé ton nom
        answer = answer..char
        screen:invalidate()
    end
end

function on.paint(gc)
    gc:drawString("< quel est votre nom ?", 0, 20)
    gc:drawString(">"..answer, 0, 40)
    if displayAnswer then
        gc:drawString("< Vous vous appellez donc "..answer, 0, 60)
        gc:drawString("< C'est tout pourrit comme nom lol :p ", 0, 80)
    end
end

function on.backspaceKey()
     answer = answer:usub(0,-2)
     screen:invalidate()
end
Votez Kasane Teto 2017
Avatar de l’utilisateur
technolapin
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Prochain niv.: 97.8%
 
Messages: 514
Images: 25
Inscription: 31 Déc 2012, 10:48
Localisation: Chez moi
Genre: Homme
Calculatrice(s):
MyCalcs profile
Classe: Chui en vacance ducon

Re: Les questions d'un débutant en Lua

Message non lude Fubuki » 26 Oct 2015, 17:05

Merci beaucoup de tes réponses détaillée @technolapin, je vais mettre à jour le premier post tout de suite :D
Avatar de l’utilisateur
Fubuki
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 26.7%
 
Messages: 5
Inscription: 26 Oct 2015, 11:42
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Les questions d'un débutant en Lua

Message non lude Fubuki » 19 Nov 2015, 20:09

Salut , je suis de retour, après seulement 1 mois... ah oui 1 mois ça fait longtemps quand même, et le pire c'est que je revient mais sans trop de questions, seulement 2, mais bon j'ai pas trop de temps à consacrer à la programmation avec les cours, la terminal S plus 2 hures de transport, ça pardonne pas ^^". Bon allez, perdons pas de temps, voici, pour ceux qui en on à m'accorder, 2 nouvelles de mes questions idiotes :P

:help: Donc, là c'est pas vraiment une question, puisque j'ai trouvé la réponse tout seul comme un grand, mais je la met quand même pour ceux qui rencontreraient le même problème car je suis très gentil. Dans la leçon 6 de Steeve Arnold, (http://compasstech.com.au/TNS_Authoring ... _tut6.html) à à un moment, quand on met le code pour utiliser les flèches, on ne peut changer de position qu'une fois et il faut recompiler à chaque fois ? pourquoi ?? voilà le code :

Code: Tout sélectionner
function on.arrowKey(key)
if key == "down" then
local y = (var.recall("py") or 0)
var.store("py", y-1)
elseif key == "up" then
local y = (var.recall("py") or 0)
var.store("py", y+1)
elseif key == "left" then
local x = (var.recall("px") or 0)
var.store("px", x-1)
else
local x = (var.recall("px") or 0)
var.store("px", x+1)
end
screen:invalidate()
end


En fait si vous rencontrez le même problème, c'est que vous êtes des grosse feignasses et que vous avez directement copié-collé l code sur le site, regardez la dernière ligne, screen:invalidate() screen est une variable qui est censé contenir platform.window, essayez de rajouter tout en haut "local screen = platform.window" et ça marchera.

:help: number two, dans la leçon 7 (juste après quoi) pour "définir" - Je sais pas si ça ce dit - une nouvelle image, on écrit

Code: Tout sélectionner
bridge1 = image.new("..digital code for image..")


Moi je veux bien, mais le code digital pour la nouvelle image je le trouve où ??

voilà, c'est fini, si vous avez la patience de me répondre, je serait très content :)

Voilà, Fubuki vous remerci
Avatar de l’utilisateur
Fubuki
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 26.7%
 
Messages: 5
Inscription: 26 Oct 2015, 11:42
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

Re: Les questions d'un débutant en Lua

Message non lude Adriweb » 19 Nov 2015, 20:33

Steve Arnold a en effet l'habitude d'assigner "screen" à "platform.window" histoire de faire plus court.

Le image.new avec un gros string à l'intérieur, c'est pour les anciennes versions. Maintenant (OS 3.6 et plus), il vaut mieux passer par des "Resources", qui constituent un onglet spécifique dans l'éditeur de script Lua sur le logiciel Nspire.
Puis dans le code : image.new(_R.IMG.img_1) par exemple.

Plus d'info ici : https://wiki.inspired-lua.org/image.new
Image

MyCalcs: Help the community's calculator documentations by filling out your calculators info!
MyCalcs: Aidez la communauté à documenter les calculatrices en donnant des infos sur vos calculatrices !
Inspired-Lua.org: All about TI-Nspire Lua programming (tutorials, wiki/docs...)
Avatar de l’utilisateur
AdriwebAdmin
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Prochain niv.: 80.1%
 
Messages: 14606
Images: 1216
Inscription: 01 Juin 2007, 00:00
Localisation: France
Genre: Homme
Calculatrice(s):
MyCalcs profile
Twitter/X: adriweb
GitHub: adriweb

Re: Les questions d'un débutant en Lua

Message non lude Fubuki » 19 Nov 2015, 23:15

Oh, c'est génial, mes dessins s'affichent sur ma calculette O.O
super, merci beaucoup, j'éditerait le premier post demain ^^
Avatar de l’utilisateur
Fubuki
Niveau 2: MI2 (Membre Initié)
Niveau 2: MI2 (Membre Initié)
Prochain niv.: 26.7%
 
Messages: 5
Inscription: 26 Oct 2015, 11:42
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile


Retourner vers Nspire-Lua

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1050 utilisateurs:
>1041 invités
>4 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)