Aller au contenu

Précis Sur Les Variables Locales/globales


JossAlf

Messages recommandés

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... :13:

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 ! :60:

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 non
Il 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 ... :huh:

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 ?! :ph34r: Une ligne en moins au début et on passe tout de local en globale ! :o

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... :blink:

... En espérant que ce sujet vous ait été utile. :)

  • Like 1
  • Upvote 6
Lien vers le commentaire
Partager sur d’autres sites

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 ... :13: N'importenawouak !!! :blink:

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 ... :74:

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

  • 11 mois après...

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.

Lien vers le commentaire
Partager sur d’autres sites

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  :D 

Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

@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 :D

Lien vers le commentaire
Partager sur d’autres sites

@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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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 :D 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.

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

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

  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...