JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

[Lua] Table an C++ Programm übergeben

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Hasenfuß
Senior JLI'ler


Alter: 37
Anmeldedatum: 20.08.2002
Beiträge: 291

Medaillen: Keine

BeitragVerfasst am: 27.08.2006, 14:22    Titel: [Lua] Table an C++ Programm übergeben Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 31.08.2006, 08:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 31.08.2006, 08:24    Titel: Antworten mit Zitat

Ich bin mal doch nicht so faul Very Happy

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
Benutzer-Profile anzeigen Private Nachricht senden
Hasenfuß
Senior JLI'ler


Alter: 37
Anmeldedatum: 20.08.2002
Beiträge: 291

Medaillen: Keine

BeitragVerfasst am: 01.09.2006, 10:40    Titel: Antworten mit Zitat

Hi,

danke für die Antwort Smile
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 01.09.2006, 15:03    Titel: Antworten mit Zitat

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
CPP:
lua_gettop (L);

nehmen.

Hier der Link
http://www.lua.org/pil/24.2.3.html
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Hasenfuß
Senior JLI'ler


Alter: 37
Anmeldedatum: 20.08.2002
Beiträge: 291

Medaillen: Keine

BeitragVerfasst am: 02.09.2006, 17:27    Titel: Antworten mit Zitat

Also mittlerweile hab ichs jetzt geschafft denke ich Smile Danke!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Chriss
Senior JLI'ler



Anmeldedatum: 18.08.2004
Beiträge: 267

Medaillen: Keine

BeitragVerfasst am: 03.09.2006, 18:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Hasenfuß
Senior JLI'ler


Alter: 37
Anmeldedatum: 20.08.2002
Beiträge: 291

Medaillen: Keine

BeitragVerfasst am: 03.09.2006, 22:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum