Lua - Funktionen aus BlitzMax in Table einbetten

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Ratchet

Betreff: Lua - Funktionen aus BlitzMax in Table einbetten

BeitragMi, Jul 19, 2006 10:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Man hat ja die Möglichkeit BlitzMax Funktionen in Lua bekannt zu machen und diese dann in Lua aufzurufen. Ich möchte jetzt meine eigenen Funktionen in einen Table legen. Eigentlich das gleiche Prinzip wie es mit den Libaries schon in Lua drin ist, also z.B. strings.find()

Lua Beispiel wie es jetzt ist:
Code: [AUSKLAPPEN]

if expression then
  meinefunktion()
end


Lua Beispiel wie es sein soll:
Code: [AUSKLAPPEN]

if expression then
  meintable.meinefunktion()
end


Nur noch mal als Hinweis, es geht um Funktionen die ich in BlitzMax geschrieben habe und in Lua bekannt gemacht habe, nicht um Funktionen die ich in Lua selber definiere.
Ich finde keine Möglichkeit eine Funktion einem Table zuzuweisen, weiss aber das es geht. Hat jemand schon mal soetwas gemacht?
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Jan_

Ehemaliger Admin

BeitragMi, Jul 19, 2006 11:09
Antworten mit Zitat
Benutzer-Profile anzeigen
willst du die Funktionen in einen Type speichern oder in einer list?
between angels and insects

Ratchet

BeitragMi, Jul 19, 2006 11:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich spreche von Lua. Die Funktion soll in einen Lua-Table rein. Nicht in Blitz in einen Type oder eine Liste.
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Jan_

Ehemaliger Admin

BeitragMi, Jul 19, 2006 12:14
Antworten mit Zitat
Benutzer-Profile anzeigen
achso,
ich dachte, du redest von dem LUA Bmax quellcode.
between angels and insects

Ratchet

BeitragMi, Jul 19, 2006 12:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht das wir uns falsch verstehen: die Zuweisung der Funktion zum Table muss über BlitzMax geschehen.

[edit]
Soweit ich das verstehe sollte das beim Registrieren der Funktion mit lua_settable funktionieren. Doch wie finde ich nun meinen Table; dort nur einen Index übergeben? Und aus lua_gettable werde ich auch nicht schlau.
[/edit]
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Ratchet

BeitragFr, Jul 21, 2006 10:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Bin jetzt ein Stück weiter. Ich kann nun eine Funktion in einen Table einbetten. Allerdings dauert das sehr lange. Und was ich überhaupt nicht verstehe: Warum muss der TableIndex in der letzten Zeile meines Codes (lua_settable) -3 sein muss. Nur dann funktioniert es. Eigentlich müsste ich dort ja den TableIndex meines Tables angeben, ich weiss nur nicht wie ich den rauskriege. Jemand eine Idee?

Code: [AUSKLAPPEN]
' Create a new table
lua_pushstring(L, "myTable")
lua_newtable(L)
lua_settable(L, LUA_GLOBALSINDEX)

' Register custom function into table
lua_pushstring(L , "myTable")
lua_gettable(L , LUA_GLOBALSINDEX)   
lua_pushstring(L, "myFunction")
lua_pushcfunction(L, myCustomFunction)
lua_settable(L, -3)
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]

Ratchet

BeitragSa, Aug 05, 2006 13:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich denke mal ihr wollt genauso wenig wie ich dumm sterben, also hier die Lösung:

Code: [AUSKLAPPEN]
   'Neuen Table mit Namen MyTable erzeugen
   lua_pushstring(Lua.m_lua_state,"MyTable")
   lua_createtable(Lua.m_lua_state,0,1)

   'Function Lua_MyFunction als MyFunction innerhalb des Table registieren
   lua_pushstring(Lua.m_lua_state,"MyFunction")
   lua_pushcfunction(Lua.m_lua_state, Lua_MyFunction)
   lua_settable(Lua.m_lua_state,-3)

   'Den Table in den globalen Bereich schieben
   lua_settable(Lua.m_lua_state,LUA_GLOBALSINDEX)


So kann ich dann in Lua die Funktion aufrufen:
Code: [AUSKLAPPEN]
MyTable.MyFunction()
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]
  • Zuletzt bearbeitet von Ratchet am Di, März 25, 2008 16:52, insgesamt 2-mal bearbeitet
 

#Reaper

Newsposter

BeitragSa, März 15, 2008 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Thread ist zwar nun schon etwas älter, aber ich wollte keinen neuen erstellen:

Habe das nun auch mal versucht, bekomme es allerdings leider nicht hin. Lua behauptet, das meine Table (z.B. namens "SC") nicht existieren würde.
Habe leider keine Ahnung, was ich nun falsch mache. (Man bin ich immer Ahnungslos Sad)
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Ratchet

BeitragDi, März 18, 2008 11:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Also mein Beispiel funktioniert auf jeden Fall. Poste doch mal ein wenig Code, weil sonst kann dir wohl keiner helfen.
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]
 

#Reaper

Newsposter

BeitragDi, März 18, 2008 22:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, hab es im großen und ganzen so mal übernommen. Ich weiß allerdings leider nicht, für was alle Parameter der Funktionen gut sind.

Hier mal ein Codeabschnitt:
Code: [AUSKLAPPEN]

lua_pushstring(TLua.scriptEnv.m_lua_state,"MyTable")
lua_createtable(TLua.scriptEnv.m_lua_state,0,1)
lua_pushstring(TLua.scriptEnv.m_lua_state,"Create")
lua_pushcfunction(TLua.scriptEnv.m_lua_state, LCreateShortcut)
lua_settable(TLua.scriptEnv.m_lua_state,-3)


Lua gibt mir ganz einfach zurück:
Zitat:
Test.lua:3: attempt to index global 'MyTable' (a nil value)


Falls mehr Code nötig ist, einfach sagen Wink

Danke schonmal Smile


PS: Ich dachte, dass der Code evt. veraltet sein könnte.
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Ratchet

BeitragDi, März 25, 2008 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry, da fehlte noch eine Zeile (die Letzte):

Code: [AUSKLAPPEN]
' Table erstellen
lua_pushstring(lua,"MyTable")
lua_createtable(lua,0,1)

'Erste Funktion hinzufügen
lua_pushstring(lua,"MyFunction1")
lua_pushcfunction(lua, MyLuaFunction1)
lua_settable(lua,-3)

'Zweite Funktion hinzufügen
lua_pushstring(lua,"MyFunction2")
lua_pushcfunction(lua, MyLuaFunction2)
lua_settable(lua,-3)

'Den Table in den globalen Bereich schieben
lua_settable(lua,LUA_GLOBALSINDEX)
[iMac 27"] [3,4GHz Intel Core i5 ] [8GB Ram] [NVIDIA GeForce GTX 775M 2GB] [MacOS X Yosemite] [BlitzMax + MaxGui] [Monkey X Pro]
 

#Reaper

Newsposter

BeitragDi, März 25, 2008 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow, danke! Funktioniert! Very Happy
Endlich Smile



PS:
Hab daraus gerade mal kurz eine kleine Erweiterung geschrieben, falls es wer braucht:

Code: [AUSKLAPPEN]
Type TLuaScript Extends TLuaScriptEngine
   
   Method CreateTable( TableName:String )
      lua_pushstring(m_lua_state, TableName)
      lua_createtable(m_lua_state, 0,1)
   End Method
   
   
   Method AddTableFunction( Func:Int(ls:Byte Ptr), FunctionName:String )
      lua_pushstring(m_lua_state, FunctionName)
      lua_pushcfunction(m_lua_state, Func)
      lua_settable(m_lua_state, -3)
   End Method
   
   
   Method CloseTable()
      lua_settable(m_lua_state, LUA_GLOBALSINDEX)
   End Method
   
End Type


Sollte selbsterklärend sein.
Kann man ja evt. auch einfach direkt in das Modul mit einbauen.
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group