Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Hasenfuß Senior JLI'ler

Alter: 37 Anmeldedatum: 20.08.2002 Beiträge: 291
Medaillen: Keine
|
Verfasst am: 27.08.2006, 14:22 Titel: [Lua] Table an C++ Programm übergeben |
|
|
Hallo,
ich habe eine LuaFunktion, die, wenn sie aufgerufen wird, am Ende mehrere int-Werte an das C++-Programm übergeben soll. Das Problem ist, dass es von verschiedenen Flags abhängt, welche und auch wie viele dieser Werte es sind. Ich hatte mir dann überlegt, das ganze mit einem Table zu machen, so dass es ungefähr so ausschaut:
Code: |
if get_flag("flag1") == 1 then table.insert(t,13) end
if get_flag("flag2") == 4 then table.insert(t,47) end
-- und so weiter eben
return t -- und hier is das problem
|
aber return funtioniert bei ganzen tables nicht, bzw. ich weiß nicht, wie ich dann von C++ aus auf Tables auf dem Stack zugreife und sie lese. Die einzige Möglichkeit, die mir eingefallen ist, ist dass ich am Ende zB. immer schreibe "return t[1],t[2],t[3]...t[20]" oder so. Das ist aber gar nicht schön und sieht für mich einfach so aus, als obs da was besseres gibt.
Hat da jemand ne Ahnung? |
|
Nach oben |
|
 |
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 31.08.2006, 08:21 Titel: |
|
|
Hi,
Hier findest du was du suchst.
http://www.lua.org/pil/25.1.html
Dieses Onlinebuch ist generell sehr zu empfehlen, wenn man mit Lua arbeiten will.
Grüße |
|
Nach oben |
|
 |
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 31.08.2006, 08:24 Titel: |
|
|
Ich bin mal doch nicht so faul
in Lua
Code: |
background = {r=0.30, g=0.10, b=0}
|
in C / C++
CPP: | lua_getglobal(L, "background");
if (!lua_istable(L, -1))
error(L, "`background' is not a valid color table");
red = getfield("r");
green = getfield("g");
blue = getfield("b");
|
|
|
Nach oben |
|
 |
Hasenfuß Senior JLI'ler

Alter: 37 Anmeldedatum: 20.08.2002 Beiträge: 291
Medaillen: Keine
|
Verfasst am: 01.09.2006, 10:40 Titel: |
|
|
Hi,
danke für die Antwort
Aber für diese Funktion muss der table doch direkt in der lua datei deklariert sein oder?
Denn ich hab ja ne Funktion, die den table dann zurück gibt, also die über getglobal aus C++ heraus ausgerufen wird. Und wenn die abgelaufen ist, dann ist ja der table auch wieder gelöscht oder?
Mir fallen jetzt nur die Möglichkeiten ein, den table einmal in der datei global zu deklarieren und dann über die Funktionen nur zu verändern, oder das Ende der Funktion über ein yield zu verhindern, den table abzufragen, und die Funktion über resume beenden. Ist das dann eine gute Lösung? |
|
Nach oben |
|
 |
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 01.09.2006, 15:03 Titel: |
|
|
Lua benutzt für die Werteübergabe von C zu Lua und umgekehrt einen eigenen Stack. Wenn du also eine Luafunktion von C aus aufrufst und dann in C das Ergebnis abfragst, ist die Rückgabevariable ( in deinem Fall die Tabelle) im Stack noch vorhanden.
Schau dir mal das Onlinebuch durch, da wird sowas auch behandelt. Nicht mit Tabellen aber alle Variablen sind für Lua quasi gleich. Du darfst nur zwischendurch keine andere Funktion in Lua aufrufen.
Anstelle von
CPP: | lua_getglobal(L, "background");
|
kannst du
nehmen.
Hier der Link
http://www.lua.org/pil/24.2.3.html |
|
Nach oben |
|
 |
Hasenfuß Senior JLI'ler

Alter: 37 Anmeldedatum: 20.08.2002 Beiträge: 291
Medaillen: Keine
|
Verfasst am: 02.09.2006, 17:27 Titel: |
|
|
Also mittlerweile hab ichs jetzt geschafft denke ich Danke! |
|
Nach oben |
|
 |
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 03.09.2006, 18:58 Titel: |
|
|
Mit dem was ich gepostet hab oder hast du eine andere Lösung gefunden?
Wenn du was anderes hast könntest du es ja für uns posten. Ich denke der ein oder andere könnte das später auch mal gebrauchen. |
|
Nach oben |
|
 |
Hasenfuß Senior JLI'ler

Alter: 37 Anmeldedatum: 20.08.2002 Beiträge: 291
Medaillen: Keine
|
Verfasst am: 03.09.2006, 22:06 Titel: |
|
|
Natürlich, entschuldigung.
Also zT. mit dem was du gepostet hast, mit lua_getglobal für den table, allerdings habe ich noch das hier zusätzlich zur hilfe genommen:
http://lua-users.org/lists/lua-l/2004-04/msg00201.html
Habe aber etwas zeit gebraucht, bis ich das ganze verstanden habe.
Wichtig ist, dass man vor der while schleife mit lua_next lua_pushnil aufruft, und dass man als letzten schritt in der schleife lua_pop(L,1) aufruft, um den Wert zu löschen. |
|
Nach oben |
|
 |
|