Aller au contenu

j'apprend le LUA mai


Messages recommandés

Posté(e) (modifié)

normal, ta fonction retourne 2 valeurs.

avec la méthode actuelle du print ne permet d'afficher que la première.

 

essaye

-- On appelle la fonction Calcul en lui passant 2 paramètres
local retour1, retour2 = Calcul(param1, param2)
print(retour1, retour2)

 

 

Modifié par jjacques68
Posté(e) (modifié)

j'ia trouver

 

-- la fonction Calcul reçoit 2 arguments (x et y)
function Calcul(x, y)

  local r1 = x * y
  local r2 = x + y
  
return r1, r2
end

-- Affectation multiple
local param1, param2 = 100, 100
 
 local multi, add = 0, 0
 
 multi, add = Calcul(param1, param2)
 
  print("Le total de R1 est = "..multi.." et R2" ..add)

 

Modifié par 971jmd
  • Like 1
Posté(e)
tu n'a pas besoin du "local" devant la fonction.

Personnelle j'utilise toujours local pour limiter la propagation de celle-ci

 

Si j'ai besoin d'une variable permanente la je n utilise pas local

 

Donc dans une fonction on utilise e générale des variables qui ne servent plus ensuite d'où l'utilité du local et on retourne le résultat avec return

 

Envoyé de mon BLA-L29 en utilisant Tapatalk

 

 

 

  • Like 1
Posté(e)

il faut les " local" pour R1 et R2, c'est plus propre.

du coup elles ne peuvent être utilisées que dans la fonction. Elles ont une portée locales à la fonction.

Tu ne peux pas les utiliser en dehors de la fonction.

il n'y a pas d'intérêt (dans ce cas) à chercher à les utiliser en-dehors de la fonction.

Vu que tu fais un "return" de ces variables locales.

 

en effet si tu ne voulais pas utiliser "return", il faudrait alors déclaré les variables R1 et R2 en dehors de la fonction, pour qu'elle devienne globales (à la scène), et donc utilisable partout

alors un print(R1,R2) fonctionnerait.

Mais c'est pas propre... ça à aucun intérêt, et la fonction non plus du coup...

Posté(e) (modifié)

Très bien je vais étudier tout ça  

je sature;)

 

un grand merci plein de soleil de la Guadeloupe

Modifié par 971jmd
Posté(e)
Il y a 2 heures, jjacques68 a dit :

Mais c'est pas propre... ça à aucun intérêt, et la fonction non plus du coup...

 

Je dirais que c'est plus sage c'est de faire comme cela pour ne pas perdre la tête :D c'est donc un conseil judicieux de @jjacques68

 

Mais nous pourrions en débattre 2 bonnes heures de ces trois affirmations :60:

  1. Pas propre: c'est très relatif
  2. Aucun intérêt: partage des variables privées entre fonctions, limitation du passage d'arguments, optimisation du code, etc. le revers est que cela impact souvent la lisibilité du code.
  3. La fonction non plus: C'est au cas par cas, mais une fonction ne doit pas obligatoirement retourner une valeur

 

En complément, il existe également le bloque do end, ce dernier permet de définir soit même la portée de portion de son code, très utilise dans beaucoup de cas. (https://www.lua.org/pil/4.2.html)

 

Bon codage ;)

 

  • Like 1
Posté(e) (modifié)

salut @Krikroff

 

oui effectivement c'est vrai casse-tête pour un débutant.:P Sans oublier les enfants dans la maison

 

Mais grâce à vous et ma persévérance j'avance..

 

j'ai crée un petit code quipermet de calculer une surface 

function Calcul(x, y)
  
print("----------CALCUL SURFACE------------")

io.write("Longeur N°1 >> ")
x = io.read()

io.write("Largeur N°2 >> ")
y = io.read()

local r1 = x * y
  
 return r1  end
 
 multi = Calcul()
 
 print("Le total de la surface est: "..multi.." M2")

   bon 

J'ai voulu sophistiquée le résultat final du style en affichant la Long et la Larg dans le printe 

 Le total de 10 m par  10 m est de .....

 

Mais je n'y suis pas arrivée.

 

 

Modifié par 971jmd
Posté(e)

Et ça aussi, bon peut être pas très propre mai c'est un début


--[[
%% properties
33 value
24 value
%% events
%% globals
--]]
function Calcul(x, y)
local r1 = x + y
 
return r1  
end


local param1 = tonumber(fibaro:getValue(33, "value"))
local param2 = tonumber(fibaro:getValue(24, "value"))

total_V1 = Calcul(param1, param2)  
 
 print("Le total des lampes = "..total_V1)

-----------
 if (param1 > param2) 

  then 
   fibaro:call(244, "turnOff")
  else
  fibaro:call(244, "turnOn")
  
  
  print(variableA)
     end

 	return variableA

 

Posté(e)

les fonctions "io.xxxxx" ne fonctionnent pas sur la HC2 il me semble !!

 

attention, tout ce que tu fais sur ton logiciel, ne peut pas être reproduit dans la HC2 !!

 

dans ton 2ème exemple, c'est "variableA" ? elle apparaît d'un coup ! 

Puis il y a un return de cette variable, mais le mot return est réservé pour les fonctions, là on est plus dans la fonction !

Posté(e)

salut 

 

Oui j'ai fait le ménage :D

 

function Calcul(x, y)
  
local r1 = x + y
   
return r1  
end

local param1 = tonumber(fibaro:getValue(33, "value"))
local param2 = tonumber(fibaro:getValue(24, "value"))

total_V1 = Calcul(param1, param2)  
 
print("Le total des lampes = "..total_V1.. " %")

----si lalampe du salon est > que la cuisine
if (param1 > param2) 

then 
   fibaro:call(244, "turnOn")
else
  fibaro:call(244, "turnOff")
end

 

 

Posté(e) (modifié)

ben la règle 2 utilise les fonctions de la règle 1.

 

la fonction3 renvoie 2 résultats : R1 et R2.

 

dans le premier cas, on récupère les 2 retour de la fonction3, respectivement dans x et y.

dans le 2ème cas, on ne récupère que la première valeur, il n'y a que x qui récupère R1 (pas de y, donc pas de R2)

 

dans le 3ème cas, c'est tordu

 

on a d'un côté : x,y,z

aux qu'elles ont affecte respectivement : 10, et les retours de la fonction3.

donc x = 10 et y=R1 et z = R2, comme c'est dit dans les commentaires...

Modifié par jjacques68
Posté(e) (modifié)

oui j'ai bossé sur lua tout l'après-midi et je commence à comprendre beaucoup de chose :)

 

 

Mais les fonctions ce n'est pas encor ça

 

La fonction que je ne comprends pas est :

function AfficheArguments(...)

Une fonction avec comme argument 3 point  

 

Modifié par 971jmd
Posté(e) (modifié)

salut

 

poiuuuuuu je bloque sur le principe des fonctions.

 

Pour comprendre je n'arrive pas à mettre l'exemple suivant en pratique

local x, y, z = 0, 0, 0
x, y = Fonction1()    --> x = nil, y = nil (la fonction n'a pas de return)
x, y = Fonction2()    --> x = R1, y = nil (la fonction a 1 seul return)
x, y, z = Fonction3() --> x = R1, y = R2, z = nil (il n'y a pas de 3e return)
print(Fonction1())            --> 
print(Fonction2())        --> R1
print(Fonction3())            --> R1   R2
print(Fonction3(), 1)        --> R1   1
print(Fonction3(),.. "x")    --> R1x    (c'est la concaténation de Fonction3 et de "x")

 

Modifié par 971jmd
Posté(e)

Pour comprendre tu fais 3 colonnes

 

Et tu les rempli avec les variables puis avec les résultats ça te parlera peut-être mieux

EXEMPLE

 

x, y, z = 10, R1, R2

 

X. Y. Z

10 R1 R2

 

Envoyé de mon BLA-L29 en utilisant Tapatalk

 

 

 

 

Posté(e)

j'ai trouver ça mai je n'arrives pas à le fair fonctionnée 

 function f (op, a, b)
  if op == 'add' then
   return a + b
   
  elseif op == 'sub' then
   return a - b
   
  end
  error("invalid operation")
 end
 
function g (value)
  print(value)
 end

-----------RESULT-----------------

> = f('add', 1, 2) -- args are given inside (), separated by commas.
3

> = f('add', 1, 2, 123) -- extra args are ignored
3

> = f('add', 1) -- missing args aren't an error, instead they will be filled with nil, which might cause an error in the function's code
stdin:1: attempt to perform arithmetic on local 'b' (a nil value)


> = g() -- to call a function with no args, use ()
nil

> = g "example" -- the () can be omitted if you have one quoted string arg
example

> = g {} -- same with one table constructor
table: 0x820ee0

 

Posté(e)

il faut tester la présence de tes arguments :

 

si y en manque un, on retourne une erreur.

function f (op, a, b)
  
  if op and a and b then				--si tous les arguments sont là
    if op == 'add' then					--add
      return a + b
   
    elseif op == 'sub' then				--sub
      return a - b
  
    else
      print("ERROR : unknown first argument")		--opération inconnue
      return false
    end
    
  else
    print("ERROR : argument missing)			--arguments manquant
    return false
  end
      
 end

 

attention, je sui spas sûr que la fonction error() existe sur la HC2, je sais plus, je n'en ai plus.

elle existe sur la HC3 (fibaro.error()).

Posté(e) (modifié)

Salut, j'ai oublié de te dire que mon apprentissage LUA est principalement sur Zerobrane studio  https://studio.zerobrane.com/

 

et le prolemme que je rencontre avec les site les sites francophones le LUA ne sont pas très bien converti.

 

J'ai testé le code et il ne s'emble pas avoir d'erreur mai j'ai aucun résultat rien 

Program completed in 0.10 seconds (pid: 18744).

 

 

Modifié par 971jmd
×
×
  • Créer...