2 votes

Lire les noms de variables dynamiques en Lua

J'aimerais savoir s'il est possible de lire les noms des variables dynamiques ? Puisque le programme qui transmet les variables à mon script les appelle juste "in1, in2, in3" etc. J'espère qu'il y a un moyen de faire une boucle, parce que c'est assez ennuyeux de traiter chaque entrée séparément...

Voici ce que j'ai essayé jusqu'à présent, mais je n'ai obtenu qu'une erreur.

for i=1,19,2 do
myvar[i] = ["in"..i]
end 

Je suis assez novice en Lua, mais j'espère que la solution n'est pas si difficile :D

Editer : Je vais essayer de vous donner plus d'informations. Le programme "Main" n'est pas écrit en Lua et se contente de définir les variables "in1 ... ". Il s'agit d'une sorte de logiciel de programmation robotique avec de nombreuses fonctions intégrées. C'est la raison pour laquelle je ne peux pas simplement utiliser d'autres noms de variables ou un tableau. Il ne s'agit donc pas d'une fonction ou de quoi que ce soit d'autre en rapport avec Lua... Voici une petite capture d'écran http://www.bilderload.com/daten/unbenanntFAQET.jpg Pour l'instant, le script Lua ne passe que la première entrée.

5voto

Nicol Bolas Points 133791

Cela dépend de ce que vous entendez par "noms de variables dynamiques".

Les noms des variables locales n'existent pas. Les variables locales sont toutes les variables déclarées en tant que paramètre d'une fonction ou avec l'attribut local mot-clé. Les variables locales sont compilées en offsets dans la pile Lua, donc leurs noms n'existent pas. Vous ne pouvez pas indexer quelque chose par son nom pour les obtenir.

Les variables globales sont membres du tableau global. Par conséquent, ces façons de définir une variable globale sont équivalentes :

globalVar = 4
_G.globalVar = 4
_G["globalVar"] = 4

Puisque le programme qui transmet les variables à mon script les appelle simplement "in1, in2, in3" etc.

Le programme qui transmet des variables à votre script ne peut pas les nommer. Une variable n'est qu'un emplacement pour une valeur. Elle n'est pas propriétaire de cette valeur. Lorsque votre fonction reçoit des arguments, votre fonction les nomme.

Vous n'avez pas dit grand-chose sur la structure de votre programme, je ne peux donc pas vraiment vous donner de bons conseils. Mais si vous voulez simplement prendre un certain nombre de valeurs en tant que paramètres et y accéder en tant qu'entrées, vous pouvez le faire de deux manières. Vous pouvez prendre un tableau contenant des valeurs comme paramètre, ou vous pouvez prendre un varargs :

function MyFunc1(theArgs)
  for i, arg in ipairs(theArgs) do
    --Do something with arg.
  end
end

function MyFunc2(...)
  for i, arg in ipairs({...}) do
    --Do something with arg.
  end
end

MyFunc1 {2, 44, 22} --Can be called with no () because it takes a single value as an expression. The table.
MyFunc2(2, 44, 22)

1voto

jpjacobs Points 6838

L'auteur du code qui recrache ces "variables dynamiques" n'a pas fait du bon travail. Les avoir est une mauvaise habitude, et peut entraîner une perte de données, un encombrement de l'espace de noms global, ...

Si vous pouvez le modifier, il serait préférable de produire un tableau contenant les résultats.

Cela dit, votre solution n'est pas très éloignée de la réalité, mais ["in"..i] n'est pas une syntaxe Lua valide. Vous n'indexez rien. Si ces variables sont des globales, votre code devrait être le suivant :

for i=1,19,2 do
    myvar[i] = _G["in"..i]
end

Cette opération permet de lire les valeurs contenues dans vos variables dans le tableau global.

1voto

lhf Points 30556

Essayez ceci

myvar={ in1, in2, in3, in4, in12, in13, in14, in15, in16, in17, in18, in19 }

si les variables sont transmises en tant que variables globales, ou ceci

myvar = {...}

si les variables sont transmises comme arguments au script.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X