Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
c_i_lua [2010/12/29 11:54] sjablon1 |
c_i_lua [2010/12/29 12:07] sjablon1 |
||
---|---|---|---|
Linia 222: | Linia 222: | ||
luaL_openlibs(L); | luaL_openlibs(L); | ||
| | ||
- | // wykonanie skryptu Lua | + | // wczytanie skryptu Lua |
if (luaL_dofile(L, "zpr.lua")) | if (luaL_dofile(L, "zpr.lua")) | ||
{ | { | ||
- | // Walidacja wykonania skryptu | + | // Walidacja wcztania skryptu |
std::cout << "Error while running script: " << lua_tostring(L, -1) << std::endl; | std::cout << "Error while running script: " << lua_tostring(L, -1) << std::endl; | ||
return 1; | return 1; | ||
Linia 240: | Linia 240: | ||
- | === Wywoływanie funkcji Lua w C++ === | + | === Wywoływanie funkcji Lua w kodzie C++ === |
+ | Potrafimy już z poziomu kodu C++ zainicjalizować maszynę wirtualną Lua i uruchomić skrypt napisany w Lua. Przejdźmy krok dalej - spróbujmy wywołać funkcję zdefiniowaną w skrypcie Lua z poziomu kodu C++. Zacznijmy od przykładowej funkcji obliczającą różnicę dwóch liczb. | ||
- | === Wywoływanie funkcji C++ w Lua === | + | **Listing 7** Funkcja Lua obliczającą różnicę dwóch liczb. |
+ | |||
+ | <code cpp> | ||
+ | |||
+ | --sub.lua | ||
+ | |||
+ | function(x,y) | ||
+ | return x - y | ||
+ | end | ||
+ | |||
+ | |||
+ | </code> | ||
+ | |||
+ | Aby umożliwić wywoływanie funkcji ze skryptu Lua musimy zdefiniować kodzie C++ funkcję, w której odłożymy na stos parametry funkcji, a następnie | ||
+ | zdejmiemy ze stosu wartość zwracaną przez funkcję. Ilustruje to poniższy przykład: | ||
+ | |||
+ | |||
+ | <code cpp> | ||
+ | |||
+ | #include <iostream> | ||
+ | |||
+ | // dołączenie nagłówków Lua | ||
+ | extern "C" | ||
+ | { | ||
+ | #include "lua.h" | ||
+ | #include "lualib.h" | ||
+ | #include "lauxlib.h" | ||
+ | } | ||
+ | |||
+ | |||
+ | // Interpretator Lua | ||
+ | lua_State* L; | ||
+ | |||
+ | |||
+ | // Funkcja wywołującą funkcję ze skryptu Lua i zwracająca otrzymany wynik | ||
+ | int luaSub(int x, int y) | ||
+ | { | ||
+ | |||
+ | int sub = 0; | ||
+ | |||
+ | // nazwa funkcji w pliku sub.lua | ||
+ | lua_getglobal(L, "sub"); | ||
+ | |||
+ | // pierwszy argument | ||
+ | lua_pushnumber(L, x); | ||
+ | |||
+ | // drugi agrument | ||
+ | lua_pushnumber(L, y); | ||
+ | |||
+ | // wywołanie funkcji z dwoma argumentami i jedną wartością zwracaną | ||
+ | lua_call(L, 2, 1); | ||
+ | |||
+ | // pobranie wyniku i zdjęcie ze stosu | ||
+ | sub = static_cast<int>(lua_tointeger(L, -1)); | ||
+ | |||
+ | lua_pop(L, 1); | ||
+ | return sub; | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | int sub = 0; | ||
+ | |||
+ | // utworzenie maszyny wirtualnej Lua. | ||
+ | L = lua_open(); | ||
+ | |||
+ | // inicjalizacja standardowych bibliotek | ||
+ | luaL_openlibs(L); | ||
+ | |||
+ | // wczytanie skryptu Lua | ||
+ | if (luaL_dofile(L, "sub.lua")) | ||
+ | { | ||
+ | // Walidacja wcztania skryptu | ||
+ | std::cout << "Error while running script: " << lua_tostring(L, -1) << std::endl; | ||
+ | return 1; | ||
+ | } | ||
+ | |||
+ | // wywołanie funkcji | ||
+ | sub = luaSub( 10, 15 ); | ||
+ | |||
+ | std::cout << "Substraction: " << sub << std::endl; | ||
+ | |||
+ | // zamknięcie maszyny wirtualnej | ||
+ | lua_close(L); | ||
+ | return 0; | ||
+ | |||
+ | } | ||
+ | |||
+ | </code> | ||
+ | |||
+ | |||
+ | === Wywoływanie funkcji C++ w kodzie Lua === | ||
BUUU | BUUU | ||