Aller au contenu
Tomsauy

Étrangeté LUA

Recommended Posts

Bonjour,

 

voila je partage ma surprise et je recherche une explication du pourquoi du comment....

Ci dessous 2 morceaux de code, l'un ne fonctionne pas (Le premier) et l'autre fonctionne (Le second vous l'aurait deviné :))

 

--NE FONCTIONNE PAS
[...]

function findTimeZone(prog)
[...]
	fibaro.debug("currentTime : "..currentTime)
[...]
end

[...]

---------------------
-- Start Main Code --
---------------------
[...]
local currentTime = string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min)
[...]

if (test ~= "TOTO") then
	[...]
	zoneStatus = findTimeZone("TOTO")
	[...]
end

[...]

 

-- FONCTIONNE
[...]
local currentTime = string.format("%02d", currentDate.hour) .. ":" .. string.format("%02d", currentDate.min)
[...]

function findTimeZone(prog)
[...]
	fibaro.debug("currentTime : "..currentTime)
[...]
end

[...]

---------------------
-- Start Main Code --
---------------------
[...]
if (test ~= "TOTO") then
	[...]
	zoneStatus = findTimeZone("TOTO")
	[...]
end

[...]

 

Vous l'aurez compris la seul différence se situe sur l'emplacement de la déclaration de la variable currentTime en fonction de la fonction qui l'utilise (c'est pas la seul fonction qui l'utilise)

Mais pour autant au moment de l'appel de la fonction elle même, qui se situe dans le "Main" et donc bien après la déclaration de la fonction ou de la variable, celle ci à bien une valeur affectée...

Bref je ne comprends pas ce qui déconne d'un point de vue prog (certes la variable pourrait ne pas être déclaré en local) mais c'est pas trop ça qui m'interpelle, c'est plus le fait que si on la positionne avant ou après la fonction le comportement n'est pas le même...

 

Si quelque peut m'expliquer histoire de me rendre moins bête c'est cool :) Sinon pas grave je resterai dans mon ignorance :P

 

  • Sad 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Perso jamais fait attention à ça...

J’ai toujours déclaré mes variables en premier, avant les fonctions...

 

Cela voudrait dire que lors de l’execution, il y aune interprétation de la fonction avant son appel, et du coup ce serait la raison de ce « bug »... ???

 

Curieux de savoir ce qu’en pensent les autres membres...

Partager ce message


Lien à poster
Partager sur d’autres sites

Dans le premier cas, currentTime n'est pas initialisé et vaut donc Nil lors de son premier emploi.

Dans le second cas, cette variable a bien une valeur.

 

En Lua, il y a une déclaration implicite des variables, et dans tous les langages de programmation, une variable non initialisée ne contient aucune valeur...

Partager ce message


Lien à poster
Partager sur d’autres sites

Dans ton premier code :

dans la partie start main code supprime "local" devant "currentTime".

Et test pour voir ;)

 

Modifié par trainkill666
  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites
print ("variable locale h avant déclaration : " .. tostring(h))
print ("variable globale t avant déclaration : " .. tostring(t))
print ("variable globale z avant déclaration : " .. tostring(z))

-- portée locale (valable à partir d'ici)
local h = "12h00"

print ("variable locale h après déclaration : " .. tostring(h))

function check()
	print("variable globale t dans la fonction (appelée après déclaration de la variable :)) : "..t)
end

-- porte globale (valable disponible n'importe où)
z = "hello"
t = h

print ("variable globale z après déclaration : " .. tostring(z))

check()

Tout ça pour dire que il faut déclarer avant sinon bah ça marcha pas :D 

[DEBUG] 19:29:18: variable locale h avant déclaration : nil
[DEBUG] 19:29:18: variable globale t avant déclaration : nil
[DEBUG] 19:29:18: variable globale z avant déclaration : nil
[DEBUG] 19:29:18: variable locale h après déclaration : 12h00
[DEBUG] 19:29:18: variable globale z après déclaration : hello
[DEBUG] 19:29:18: variable globale t dans la fonction (appelée après déclaration de la variable :)) : 12h00

En complément: une variable déclarée localement dans une fonction aura comme portée le corps de la fonction

Partager ce message


Lien à poster
Partager sur d’autres sites
Dans ton premier code :

dans la partie start main code supprime "local" devant "currentTime".

Et test pour voir

 

Sans le local la variable est reconnue dans tout le "script" une fois qu'elle a été déclaré

 

Envoyé de mon BLA-L29 en utilisant Tapatalk

 

 

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@mprinfo

Ah le temps du

Option Explicit
Public
Private
Public Sub
Public Function
Private Declare
Private Const
Public Enum
Dim
ReDim
ReDim Preserve
ByVal
As Long
As String
As Double
As Integer

....

:4:

Ou pire en Assembleur avec les adresses des constantes et variables à définir :huh:

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Avant tout, merci à tous pour vos retours ! :)

 

Il y a 19 heures, trainkill666 a dit :

Dans ton premier code :

dans la partie start main code supprime "local" devant "currentTime".

Et test pour voir ;)

 

Oui je suis entièrement d'accord avec toi cela marche.

Simplement je ne comprenais pas pourquoi car pour autant pour moi une variable local dans le corps du code revenait à une variable globale

 

 

Le 14/01/2019 à 20:31, Barelle a dit :

Dans le premier cas, currentTime n'est pas initialisé et vaut donc Nil lors de son premier emploi.

Dans le second cas, cette variable a bien une valeur.

 

En Lua, il y a une déclaration implicite des variables, et dans tous les langages de programmation, une variable non initialisée ne contient aucune valeur...

Je comprends cela aussi mais au moment de l'appelle de la fonction la variable currentTime a bien une valeur...

 

 

Il y a 19 heures, Krikroff a dit :

print ("variable locale h avant déclaration : " .. tostring(h))
print ("variable globale t avant déclaration : " .. tostring(t))
print ("variable globale z avant déclaration : " .. tostring(z))

-- portée locale (valable à partir d'ici)
local h = "12h00"

print ("variable locale h après déclaration : " .. tostring(h))

function check()
	print("variable globale t dans la fonction (appelée après déclaration de la variable :)) : "..t)
end

-- porte globale (valable disponible n'importe où)
z = "hello"
t = h

print ("variable globale z après déclaration : " .. tostring(z))

check()

Tout ça pour dire que il faut déclarer avant sinon bah ça marcha pas :D 


[DEBUG] 19:29:18: variable locale h avant déclaration : nil
[DEBUG] 19:29:18: variable globale t avant déclaration : nil
[DEBUG] 19:29:18: variable globale z avant déclaration : nil
[DEBUG] 19:29:18: variable locale h après déclaration : 12h00
[DEBUG] 19:29:18: variable globale z après déclaration : hello
[DEBUG] 19:29:18: variable globale t dans la fonction (appelée après déclaration de la variable :)) : 12h00

En complément: une variable déclarée localement dans une fonction aura comme portée le corps de la fonction

Désolé mais je ne comprends pas pourquoi l'appel à la fonction ne plante pas compte tenu que "t" n'a pas été initialisé avant la fonction et du coup pour moi tu es dans le même pas que mon bout de code qui ne fonctionne pas...:mellow:

 

Désolé de pas bien comprendre toutes vos explications... :( 

Mais merci de votre aide :) 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Parce que la fonction est appelée après déclaration et initialisation de la variable.

Partager ce message


Lien à poster
Partager sur d’autres sites

@Krikroff oui d'accord mais c'est bien le cas aussi dans mon premier pavé qui lui ne fonctionne pas ?

Partager ce message


Lien à poster
Partager sur d’autres sites

t est une variable de portée globale initialisée par la variable locale h déclarée avant la fonction.

 

http://www.luteus.biz/Download/LoriotPro_Doc/LUA/LUA_Training_FR/LUA_Scope_Variables.html

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Dans le premier pavé, currentTime est déclarée en tant que variable globale de la scène lors de son premier emploi dans la fonction findTimeZone. Après une autre variable déclarée elle locale, avec le même nom, est initialisée.

Partager ce message


Lien à poster
Partager sur d’autres sites

Mea-culpa ! C'est bon j'ai pigé ! :):60:

Désolé et merci encore de votre aide !

Partager ce message


Lien à poster
Partager sur d’autres sites

×