Buchempfehlung
Visual Basic 6 Kochbuch
Visual Basic 6 Kochbuch
Viele praktische Tipps zum Programmieren mit Visual Basic 6, die sich oft auch auf FB übertragen lassen. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Einbindung der Skriptsprache Lua

von RedakteurnemoredSeite 3 von 4

Verwendung des Stapelspeichers

Um Daten zwischen dem Hauptprogramm und dem Skript auszutauschen, wird für jedes aufgerufene Skript ein Externer Link!Stapelspeicher, auf englisch Stack, angelegt. Ein Stapelspeicher arbeitet nach dem Prinzip "Last-In-First-Out". Der zuletzt auf den Stapel gelegte Wert liegt also ganz oben und wird beim Abbau des Stapels als erster wieder ausgelesen.

Vor dem Aufruf des Skripts kann mit lua_pushnumber eine Zahl auf den Stack gelegt und nach der Ausführung mit lua_tonumber eine Zahl aus dem Stack auslesen (sie wird dabei jedoch nicht vom Stack entfernt). Für andere Datentypen dienen analog die Funktionen lua_pushboolean usw. Zum Lesen werden die Funktionen lua_tonumber, lua_toboolean usw. verwendet.

DatentypBeschreibungschreibenlesentesten
nilnicht zugewiesener Wertlua_pushnil-lua_isnil
booleanWahrheitswert true=1/false=0lua_pushbooleanlua_tobooleanlua_isboolean
cfunctionPointer auf eine C-Funktionlua_pushcfunctionlua_tocfunctionlua_iscfunction
integerGanzzahllua_pushintegerlua_tointegerlua_isinteger
numberDezimalzahllua_pushnumberlua_tonumberlua_isnumber
stringZSTRING PTRlua_pushstringlua_tostringlua_isstring
threadLua-Threadlua_pushthreadlua_tothreadlua_isthread
lightuserdataZeiger auf einen Datenblocklua_pushlightuserdatalua_touserdata*lua_islightuserdata

Die Liste ist nicht vollständig.

*) Hinweis: lua_touserdata wird für userdata als auch für lightlua_touserdata benötigt.

Beim Lesen aus dem Stack muss die Nummer des Wertes angeben, der aus dem Stack geholt werden soll. Dabei stehen positive Nummern wie 1, 2, 3 usw. für den Wert, der als erster, zweiter bzw. dritter in den Stack gelegt wurde. Negative Nummern zählen ausgehend vom letzten Wert: -1 steht für den zuletzt in den Stack gelegten Wert (also den, der sich ganz oben auf dem Stack befindet), -2 für den vorletzten Wert usw. Um herauszufinden, wie viele Werte überhaupt auf dem Stack liegen, dient die Funktion lua_gettop.

Das folgende Programm ruft ein Skript auf, das mit return Daten zurück gibt. Wir wissen zunächst nicht, um wie viele und welche Daten es sich dabei handelt. Daher ermittelt das Hauptprogramm zuerst die Anzahl der Werte anhand der Länge des Stacks und untersucht dann den Datentyp dieser Werte. Je nach Datentyp werden sie anschließend auf passende Weise ausgelesen und ausgegeben.

#INCLUDE ONCE "Lua/lua.bi"
#INCLUDE ONCE "Lua/lauxlib.bi"
#INCLUDE ONCE "Lua/lualib.bi"

DIM Lua AS lua_State PTR
Lua = luaL_newstate
' Skript aufrufen
IF luaL_dofile(Lua, "rueckgabe.lua") THEN
  PRINT "Skriptfehler: " & *lua_tostring(Lua, -1)
END IF

'Auswertung
FOR i AS INTEGER = 1 TO lua_gettop(Lua) ' alle Parameter auswerten
  IF lua_isNumber(Lua, i) THEN           ' Zahlenwert
    PRINT lua_toNumber(Lua, i),
  ELSEIF lua_isString(Lua, i) THEN       ' String (ZSTRING PTR)
    PRINT *lua_toString(Lua, i),
  ELSEIF lua_isboolean(Lua, i) THEN      ' Wahrheitswert (true/false)
    IF lua_toBoolean(Lua, i) THEN PRINT "true", ELSE PRINT "false",
  ELSE
    PRINT "unbekannt",
  END IF
NEXT

lua_close Lua                             ' Lua-Status freigeben
SLEEP

Das Lua-Skript rueckgabe.lua:

x = "Adieu"
return 3.14, 1+2 == 3, x

Auch der Zugriff auf globale Variablen des Skripts ist möglich. Besonders interessant ist dies, wenn das Hauptprogramm Vorgaben machen soll, die vom Skript benötigt werden. Um vom Hauptprogramm aus eine Variable des Skripts zu setzen, legt man zuerst mit lua_pushnumber (oder entsprechender Funktion) einen Wert in den Stack und weist ihn dann mit lua_setglobal einer Variablen zu (dabei wird der Wert aus dem Stack entfernt). Eine solche Zuweisung ist selbstverständlich nur vor der Ausführung des Skripts möglich.

Um nach Beendigung des Skripts einen Variablenwert auszulesen, legt man ihn mit lua_getglobal oben auf den Stack und liest ihn mit lua_tonumber – oder der Funktion, die dem gewünschten Datentyp entspricht – aus. Damit ist das Programm nicht an eine festgelegte Rückgabefunktion gebunden, sondern kann aus ein und demselben Skript je nach Anforderung andere Variablen auslesen.

Das folgende Programm belegt die Skript-Variable x im Hauptprogramm mit dem Wert 7. Das Skript erhöht diesen Wert um 3. Als Rückgabe erhalten wir entsprechend den neuen
Variablenwert 10.

#INCLUDE ONCE "Lua/lua.bi"
#INCLUDE ONCE "Lua/lauxlib.bi"
#INCLUDE ONCE "Lua/lualib.bi"

DIM Lua AS lua_State PTR
Lua = luaL_newstate
lua_pushnumber(Lua, 7)                 ' Zahl auf den Stack legen
lua_setglobal(Lua, "x")                ' vom Stack nehmen und "x" zuweisen

IF luaL_dofile(Lua, "add3.lua") THEN
  PRINT "Skriptfehler: " & *lua_tostring(Lua, -1)
END IF

lua_getglobal(Lua, "x")                ' Wert von "x" auf den Stack legen
PRINT lua_tonumber(Lua, 1)             ' Wert ausgeben
lua_close Lua
SLEEP

Das zugehörige Lua-Skript add3.lua:

x = x+3

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 10.07.2012 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 04.09.2013 von Redakteurnemored gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen