Tomsauy Posté(e) le 14 janvier 2019 Signaler Posté(e) le 14 janvier 2019 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 1
jjacques68 Posté(e) le 14 janvier 2019 Signaler Posté(e) le 14 janvier 2019 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...
Barelle Posté(e) le 14 janvier 2019 Signaler Posté(e) le 14 janvier 2019 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...
trainkill666 Posté(e) le 15 janvier 2019 Signaler Posté(e) le 15 janvier 2019 (modifié) Dans ton premier code : dans la partie start main code supprime "local" devant "currentTime". Et test pour voir Modifié le 15 janvier 2019 par trainkill666 1
Krikroff Posté(e) le 15 janvier 2019 Signaler Posté(e) le 15 janvier 2019 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 [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
mprinfo Posté(e) le 15 janvier 2019 Signaler Posté(e) le 15 janvier 2019 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 1
trainkill666 Posté(e) le 15 janvier 2019 Signaler Posté(e) le 15 janvier 2019 @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 .... Ou pire en Assembleur avec les adresses des constantes et variables à définir 1
Tomsauy Posté(e) le 16 janvier 2019 Auteur Signaler Posté(e) le 16 janvier 2019 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 [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... Désolé de pas bien comprendre toutes vos explications... Mais merci de votre aide
Krikroff Posté(e) le 16 janvier 2019 Signaler Posté(e) le 16 janvier 2019 Parce que la fonction est appelée après déclaration et initialisation de la variable.
Tomsauy Posté(e) le 16 janvier 2019 Auteur Signaler Posté(e) le 16 janvier 2019 @Krikroff oui d'accord mais c'est bien le cas aussi dans mon premier pavé qui lui ne fonctionne pas ?
Krikroff Posté(e) le 16 janvier 2019 Signaler Posté(e) le 16 janvier 2019 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
Barelle Posté(e) le 16 janvier 2019 Signaler Posté(e) le 16 janvier 2019 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.
Tomsauy Posté(e) le 16 janvier 2019 Auteur Signaler Posté(e) le 16 janvier 2019 Mea-culpa ! C'est bon j'ai pigé ! Désolé et merci encore de votre aide !
Messages recommandés