Variablennamen als String übertragen und als Variable verwenden?

  • Moin..



    [lua]
    local varString = "g_currentMission";


    local var = Hier muss ich irgendwie varString einbringen.. Nur wie?


    for k, v in pairs(var) do
    -- was machen..
    end;
    [/lua]


    Ich hoffe ihr versteht wo mein Problem ist? varString wird im Ernstfall natürlich nicht unbedingt g_currentMission sein, sondern irgend eine Variable die man grade eben braucht.. Darum muss ich den String irgendwie in den Variablennamen umwandeln.. Geht das überhaupt?



    LG

  • Genau das hab ich letztens auch schon versucht und noch nichts gefunden. Zumindest nichts, was auch mit verschachtelte Strukturen funktioniert.


    Wobei mir jetzt grade eine Idee kommt, wie man das möglicherweise lösen könnte... Muss ich mal etwas probieren.

  • Naja, verschachtelt funktioniert ja schon in gewisser Weise, aber nur wenn man einen Ausgangstable hat.


    [lua]
    x = "t1";
    y = "t2";


    a = {};
    a.t1 = {};
    a.t1.t2 = "Hallo"


    print(a[x][y]);


    [/lua]



    Wenn man nun z.b. x = "g_currentMission.player.posX" hat, kann man ja mit local vars = Utils.splitString(".", x) die einzelnen Namen nehmen. Weiß man wie viele Namen man hat kann man sie in eine passende Vorlage eintragen.. Aber man braucht eben immer einen Ausgangstable. Außerdem wäre das nicht sehr universell da man ne begrenze Anzahl von Vorlagen hätte.


    [lua]
    local vars = Utils.splitString(".", x);
    numOfStrings = table.getn(vars)


    if numOfString == 1 then
    x = vars[1];
    printOutVar = a[x]
    elseif numOfString == 2 then
    x = vars[1]
    y = vars[2]
    printOutVar = a[x][y]
    [/lua]

  • Ausgangstabelle habe wir schon, getfenf(0). Durch splitString haben wir quasi den Pfad, der lässt sich mit einer for-Schleife leicht aufbauen, ohne überhaupt irgendwelche Annahmen über die Länge zu treffen.
    Und wenn man dann dran denkt, dass LUA entgegen dem allgemeinen Standard bei Indizes von Arrays bei 1 anfängt und nicht bei 0, dann kann man sich sehr viel Testerei sparen^^ Vor allem, wenn man eigentlich überflüssigerweise auf die Indizes zugreift :D



    [expander][lua]function Cons:getVariables(inputTableString)
    local inputTable = Cons:stringToTable(inputTableString);
    for k, v in pairs(inputTable) do
    if type(k) ~= "table" then
    print("k="..tostring(k)..", type of v="..type(v)..", value of v="..tostring(v));
    else
    Cons:getVariables(k);
    end;
    end;
    end;


    function Cons:stringToTable(str)
    local levels = Utils.splitString(".", str);
    local levelsDepth = table.getn(levels);
    local tmpTable = getfenv(0);
    local result;
    if levels ~= nil and levelsDepth > 0 then
    for k,v in pairs(levels) do
    tmpTable = tmpTable[tostring(v)];
    end;
    result = tmpTable;
    else
    print(">something went wrong");
    end;
    return result;
    end;


    addConsoleCommand("getVariables", "get vars from specified table", "getVariables", Cons);[/lua][/expander]
    Bitte sehr. Einfacher Variablen Ingame auswerten geht jetzt wohl nicht mehr^^

  • Ich hole das mal wieder aus de versenkung...


    Ich habe mir das ganze auch mal angesehen, funzt auch sehr gut.


    Nur habe ich Problem bzw Frage.
    Der table den ich haben will ist dieser:

    Code
    g_currentMission.missionPDA.statsPages

    den bekomme ich auch ausgegeben, sieht dann so aus:


    Code
    k=1, type of v=table, value of v=table: 0B60C8E8
    k=2, type of v=table, value of v=table: 0B60C910
    k=3, type of v=table, value of v=table: 11745F00
    k=4, type of v=table, value of v=table: 0C0D9ED8
    k=5, type of v=table, value of v=table: 114085C8


    Aber wie bekomme ich nun diese tables ausgelesen? Oder geht das nicht?


    Denn wenn ich es so schreibe:

    Code
    g_currentMission.missionPDA.statsPages .1

    bekomme ich einen LUA fehler:

    Code
    Error: LUA running function 'getVariables'
    C:/Users/Documents/My Games/FarmingSimulator2013/mods/Info/Cons.lua(5) : bad argument #1 to 'pairs' (table expected, got nil)
  • Hm, also bei den Tables würde ich auf die altbewährte Methode setzen :D...
    [lua]g_currentMission.missionPDA.statsPages[1][/lua]


    Allerdings bekommst du dann wieder nur einen Table ausgegeben, ich habe das Ganze fix probiert...


    Was genau möchtest du denn aus dem Table auslesen, also den Wert welcher Variable?


    MfG

  • Naja, man will ja was lernen und testen und probieren und verstehen.


    Wenn ich es bei anderen tables teste, dann muss ich ja nur den nachfolgenden table dahinter schreiben, beispielsweise:


    [lua]g_currentMission.missionPDA.pdaWeatherBGOverlay[/lua]
    und bekomme die Variablen in dem table (pdaWeatherBGOverlay) ausgegeben.


    Da wollte ich halt wissen welche variablen sich in den einzelnen "stagsPages" befinden.


    Aber so wie du es schreibst:
    [lua]g_currentMission.missionPDA.statsPages[1][/lua]
    greifst du doch nur auf die 1.Variable im Table zu.


    1 ist doch aber eigentlich auch ein weiterer table. der wiederrum weitere Variablen beinhaltet, die ich ja bisher noch nicht kenne.



    In meinem Fall suche ich ja keine bestimmte Variable, mir gehts jetzt grad ja nur darum, wie ich den table ausgegeben kriege wenn der table 1 ist?
    Da ich auf beinhaltende tables immer mit einem .XY table angebe, wie oben in meinem Beispiel. Nur bei den zahlen 1-5 geht das halt irgendwie nicht.

  • Ich hab eine angepasste Variante, die auch mit Zahlen umgehen kann. Kann ich gerne posten, sobald ich wieder am Desktop bin. Mein Netbook packt LS13 nämlich nicht, enstprechend hab ich hier auch keine Mods drauf^^


    Im Prinzip wird da bei der stringToTable Funktion nur zusätzlich geprüft ob es sich bei einer Variabe aus der splitString-Funktion um eine Zahl handelt. Wenn ja wird entsprechend mit tonumber(v) die Tabelle weiter aufgebaut.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!