JossAlf Posté(e) le 23 mai 2014 Signaler Posté(e) le 23 mai 2014 Après avoir rencontré quelques difficultés avec la portée des variables, je vous propose un précis sur le sujet :Petit rappel : Une variable permet de stocker des valeurs de façon temporaire ou non dans des noms. On pourra en suite faire appel àces noms n'importe où dans notre code.Si cette gestion de l'information semble suffisante dans un petit script, il n'en va pas de même pour de longs codes (comme ceux dont nous gratifient Krikroff ou Steven) En effet, il serait catastrophique que des fonctions différentes utilisent le même nom de variable pour y stocker des valeurs !!! Les variables seraient alors écrasées ... Et ça c'est pas bon... La solution est de limiter la portée d'une variable en utilisant la notion de variable locale. Ainsi la variable locale n'aura d'existence que dans le bloc dans laquelle elle a été crée ! Mais qu'est-ce qu'un bloc ?Et bien c'est par exemple ce qui est situé entre if et end, ou entre do et end, ou encore une fonction ...Ben alors comment qu'on va faire maintenant ? Déjà, on a de la chance, puisque le Lua utilise ces 2 types de variables et que c'est super simple de les créer !Les variables Globales sont crées simplement en tapant leur nom suivi d'un "=" et de la valeur numérique souhaitée ou du texte entre "" ou ' ' : MaVariableGlobale = 1 Attention : Fibaro propose en plus une gestion particulière des variables Globales par le biais de son Panneau variables. Il sera donc inutile de la déclarer ànouveau dans votre code pour l'utiliser. Cette gestion permet d'utiliser une même variable commune àtoutes les scènes ou modules de votre HC2.Les variables Locales sont quant àelles créées en ajoutant cette fois le mot local devant le nom de la variable (c'est ce mot clé qui restreint sa portée àun bloc ou àune fonction) : local MaVariableLocale = 2 Attention : Pour changer la valeur de cette variable locale il ne sera plus nécessaire de mettre le mot clé "local" devant !Bon après ça dépend de ce que vous souhaitez faire... Mettre àjour la variable ou en créer une nouvelle (voir plus bas *)Mais c'est peut-être ce que vous voulez finalement ?Oui et nonIl faudra être vigilant quant àla portée que l'on souhaite donnée àsa variable et choisir qu'elle soit locale ou globale.En effet, dans une fonction, il peut être intéressant d'utiliser une variable et d'être certain qu'il n'y aura pas de conflit avec un nom que vous auriez utilisé avant.C'est làque vous allez utiliser la puissance de la variable LOCALE !Voici un exemple de la portée d'une variable locale (regardez la valeur retournée par le début).On voit clairement que nous avons àfaire à2 variables locales : local MaVarLocale = 1 fibaro:debug(MaVarLocale) -- donne 1 do local MaVarLocale = 5 -- création d'une nouvelle variable locale au sein du bloc (rien àvoir avec celle créée ligne 2 !) fibaro:debug(MaVarLocale) -- donne 5 end fibaro:debug(MaVarLocale) -- donne 1 Même si elles ont le même nom, elles ont été déclarées dans 2 blocs différents. Le système les considère comme complètement différentes àcause du mot clé local.Le danger avec le Lua c'est que ce langage est très permissif et qu'àforce d'omission, on peut se prendre les pieds sans le tapis ... Je m'explique en reprenant le même code qu'au dessus en supprimant le mot clé local : MaVariable = 1 -- création d'une variable globale fibaro:debug(MaVariable) -- donne 1 do MaVariable = 5 -- mise àjour de la variable globale créée ligne 2 fibaro:debug(MaVariable) -- donne 5 end fibaro:debug(MaVariable) -- donne 5 Ici nous n'avons àfaire qu'àune seule variable globale (elle s'appelle MaVariable ! Elle est considérée ici par le système comme globale car nous ne l'avons jamais déclarée avec le mot clé local.Ok ! Alors maintenant vous vous dites : je vais déclarer ma variable MaVariable en local dès la première ligne (comme ça je suis tranquille) : local MaVariable = 1 -- création d'une variable locale fibaro:debug(MaVariable) -- donne 1 do MaVariable = 5 -- ici pas de mot clé local, donc mise àjour de la variable déclarée ligne 2 fibaro:debug(MaVariable) -- donne 5 end fibaro:debug(MaVariable) -- donne 5 (C'est ici plus bas * !!!) Ici il n'y a pas d'erreur ! Ce code est valable si vous souhaitiez vraiment utiliser la même variable locale (dans un nouveau bloc) que celle déclarée en locale au début de votre script (et donc la mettre àjour). La Variable est mise àjour et non créer au sein du nouveau bloc.Le code suivant crée 4 variables locales MaVariable : local MaVariable = 0 -- création d'une variable locale do local MaVariable = 1 -- création d'une nouvelle variable locale (rien àvoir avec le ligne 2 end do local MaVariable = 2 -- création d'une nouvelle variable locale (rien àvoir avec le ligne 2 et 5 end do local MaVariable = 3 -- création d'une nouvelle variable locale (rien àvoir avec le ligne 2 ; 5 et 9) end Le code suivant crée 1 seule variable locale MaVariable et la met àjour 3 fois : local MaVariable = 0 -- création de la variable locale do MaVariable = 1 -- mise àjour de la variable déclarée ligne 2 end do MaVariable = 2 -- mise àjour de la variable déclarée ligne 2 et modifiée àla ligne 5 end do MaVariable = 3 -- mise àjour de la variable déclarée ligne 2, modifiée àla ligne 5 et modifiée ànouveau ligne 9 end Ce code utilise une seule variable Globale MaVariable car on a supprimé la 1ère ligne ! : -- On supprime la déclaration de la variable locale en la commentant : -- local MaVariable = 0 do MaVariable = 1 -- création de la variable globale ! end do MaVariable = 2 -- mise àjour de la variable globale ! end do MaVariable = 3 -- mise àjour de la variable globale ! end Subtile non ?! Une ligne en moins au début et on passe tout de local en globale ! Voilàpourquoi je disais que le côté permissif du Lua peut jouer des tours. Imaginez que vous vous trouviez àla tête de 1500 lignes de codes, il se pourrait que vous souhaitiez mettre àjour une variable globale (donc sans local devant) mais que malheureusement vous ayez àfaire àune variable locale déclarée quelques lignes au-dessus... ... En espérant que ce sujet vous ait été utile. 1 6
JossAlf Posté(e) le 23 mai 2014 Auteur Signaler Posté(e) le 23 mai 2014 Au fait, merci àTomzeBest, Steven, Lazer et Krikroff (et ceux que je pourrais oublier) qui m'ont permis de retrouver le sens commun ... Je croyais àtord que les variables globales étaient TOUTES (et uniquement déclarées) dans le panneau de variables ... N'importenawouak !!! Ce panneau de variables (n'est qu'une) est super important puisqu'il permet de partager les variables Globales entre toutes les scènes et tous les modules grâce àune base de données ...
JossAlf Posté(e) le 24 mai 2014 Auteur Signaler Posté(e) le 24 mai 2014 Mise àjour du premier message en unifiant les noms des variables "MaVariable" pour faciliter la lecture (et éviter les hiatus ou contresens). Ajout de commentaires dans le code pour faciliter la compréhension.
Berale64 Posté(e) le 25 avril 2015 Signaler Posté(e) le 25 avril 2015 Il peut être intéressant de parler du comportement des variables dans le main loop d'un VD. Le main loop s'exécute automatiquement toutes les 3s ou plus si on ajoute un sleep. Les variables déclarées "local" sont alors perdues en fin de boucle. Par contre les variables globales (pas celles du panneau de variables) sont préservées à la fin de la boucle et donc toujours présentes à l'itération suivante. ça peut éviter d'aller lire 1440 fois par jour une variable du panneau pour en avoir besoin une foi. C'est ce que je fais dans mon VD de gestion de la piscine. Je pense, mais ça demande confirmation des pros, qu'à chaque foi qu'on assigne une nouvelle valeur à la variable une nouvelle instance est créée. C'est pour cela que je fais précéder de MyVar = nil avant d’allouer une nouvelle valeur.
Lazer Posté(e) le 25 avril 2015 Signaler Posté(e) le 25 avril 2015 Tu peux faire comme ça pour éviter de ré-alliouer une variable qui a déjàété allouée : if mavariable == nil then mavariable = "Hello" 1
mprinfo Posté(e) le 26 avril 2015 Signaler Posté(e) le 26 avril 2015 Voici un complément a ce que dit JossAlf : http://www.domotique-fibaro.fr/index.php/topic/4580-les-variables-compl%C3%A9ment-dinformation-by-steven/
Berale64 Posté(e) le 26 avril 2015 Signaler Posté(e) le 26 avril 2015 Tu nous fait un tuto sur les deadlock ???
mprinfo Posté(e) le 26 avril 2015 Signaler Posté(e) le 26 avril 2015 Euh je viens de lire ce que c’était j'ai du mal avec l'anglais lol http://fr.wikipedia.org/wiki/Interblocage
Berale64 Posté(e) le 26 avril 2015 Signaler Posté(e) le 26 avril 2015 Ce sujet renvoie vers un autre qui lui même renvoie ici. On tourne en rond. En informatique, un deadlock se produit quand deux évènements s'attendent mutuellement. C'était juste la plaisanterie du dimanche. 1
JossAlf Posté(e) le 26 avril 2015 Auteur Signaler Posté(e) le 26 avril 2015 Tu nous fait un tuto sur les deadlock ??? Trop bon Envoyé de mon iPhone àl'aide de Tapatalk
mprinfo Posté(e) le 26 avril 2015 Signaler Posté(e) le 26 avril 2015 il faudrait voir pour que l'on fusionne les 2 tutos on peut aussi ajouter cela local TypeVariable = (type(VG)) fibaro:debug(TypeVariable) pour expliquer les différents type de variables @berale24 tu as bien fais de préciser "En informatique" sinon j’aurais cru que tu parlais mariage
Berale64 Posté(e) le 26 avril 2015 Signaler Posté(e) le 26 avril 2015 ça me semble, en effet, une excellente idée de fusionner tout ce qui traite des variables. Et tu as beaucoup de talent pour ça !!
Lazer Posté(e) le 26 avril 2015 Signaler Posté(e) le 26 avril 2015 Concernant la fusion, si je fusionne simplement les 2 sujets, le message de @JossAlf étant plus ancien que celui de @mprinfo, il apparaitra en premier dans le nouveau sujet. Donc mettez vous d'accord entre vous pour savoir : - si on fait une simple fusion, cela conserve les 2 messages àla suite dans le tuto (ce qui permet àchacun de conserver la paternité et les modifications de chaque message) - si l'un de vous 2 prend la responsabilité d'un nouveau tuto global regroupant toutes les infos.
mprinfo Posté(e) le 26 avril 2015 Signaler Posté(e) le 26 avril 2015 Tu fais pour le mieux c'est pas grave si il n'y a pas mon nom je ferais d'autre tuto lol Par contre pour les couleurs steven y tiens lol Envoyé avec mon SmartPhone 1
i-magin Posté(e) le 26 avril 2015 Signaler Posté(e) le 26 avril 2015 Peut-être ajouter qu'une variable globale d'un main loop ne peut pas être utilisée par les boutons du même Virtual Device (et inversement), ce qui est bien dommage.... sauf à être créée dans le panneau de variables
mprinfo Posté(e) le 26 avril 2015 Signaler Posté(e) le 26 avril 2015 @I-mangin tu dois pas nous faire un jolie tuto sur les VD au cas ou tu serais... J'ai eu pitié de toi j'ai déjàébaucher le sujet il ne reste que le mainloop, les commandes typique au VD et le passage de variable d'un bouton a l'autre soit par étiquette soit par VG Fibaro
mprinfo Posté(e) le 26 avril 2015 Signaler Posté(e) le 26 avril 2015 @JossAlf si tu veux faire plaisir a Steven il est Fan des couleurs des années yéyés. Il adore les tutos en couleurs
JossAlf Posté(e) le 26 avril 2015 Auteur Signaler Posté(e) le 26 avril 2015 @lazer fais au mieux (ce qui te/vous semble le plus logique/lisible pour le lecteur), je n'ai pas d'égo au niveau de la paternité (je parle pas de celle de mes gosses hein !) Envoyé de mon iPhone àl'aide de Tapatalk
JossAlf Posté(e) le 26 avril 2015 Auteur Signaler Posté(e) le 26 avril 2015 Comme vous pouvez le voir je suis sur téléphone et en vacances. La rédaction d'un complément àce Tutot me semble compliquée @Mprinfo si tu veux faire un copier/coller de ton Tutot ici ne te gêne pas. Envoyé de mon iPhone àl'aide de Tapatalk
Lazer Posté(e) le 26 avril 2015 Signaler Posté(e) le 26 avril 2015 Bon je pense que je vais vous laisser prendre le temps de compléter vos tutos respectifs. Y'a pas d'urgence, JoffAlf profite de tes vacances Ensuite je ferai une fusion des 2 sujets, et je ferai le grand ménage des 2 fils de discussion, donc il ne restera plus que 2 posts, un chacun Celui de JossAlf étant le plus ancien, il apparaitra donc avant celui de mprinfo. On verrouillera le sujet et ça partira dans la section pour les nuls. 1
Steven Posté(e) le 27 avril 2015 Signaler Posté(e) le 27 avril 2015 En effet, le post de JoffAlf est plus ancien que celui de l'ancien.
mprinfo Posté(e) le 27 avril 2015 Signaler Posté(e) le 27 avril 2015 Le nouveau membre du mois et encore un peu plus ancien c'est vrai que depuis quelques mois on met a l'honneur les plus tout jeune. Je me pose donc la question que font les jeunes (@steven tu nest pas dans cette catégorie ☺) Envoyé avec mon SmartPhone 1
CASINOS Posté(e) le 27 avril 2015 Signaler Posté(e) le 27 avril 2015 Bonjour Je souhaiterais changé la valeur d'une variable en envoyant la nouvelle valeur en http , exemple http://admin:admin@IPbox / api ... nameVariable =test, valeur = 35km Est faisable car j'ai uniquement reusi en envoyer une valeur a un Slider mais ma varible n'est pas un nombre donc cela ne marche pas ? Merci de votre aide
CASINOS Posté(e) le 27 avril 2015 Signaler Posté(e) le 27 avril 2015 j'ai essayé de changer la varible "Test" présente dans mon panneau des variables avec : curl -X PUT -d '{"name": "Test", "value": "122Km"}' http://admin:admin@IPbox/api/globalVariables Mais cela ne fonctionne pas Note je suis en V.3.6
Steven Posté(e) le 27 avril 2015 Signaler Posté(e) le 27 avril 2015 pour modifier une variable, tu dois faire un put sur http://admin:admin@I...globalVariables/Test et envoyé {"value": "122Km", "isEnum": false}
Messages recommandés