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 12:04] sjablon1 |
c_i_lua [2010/12/29 12:20] 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 260: | Linia 260: | ||
zdejmiemy ze stosu wartość zwracaną przez funkcję. Ilustruje to poniższy przykład: | zdejmiemy ze stosu wartość zwracaną przez funkcję. Ilustruje to poniższy przykład: | ||
+ | **Listing 8** Przykład wywołania funkcji Lua w kodzie C++. | ||
<code cpp> | <code cpp> | ||
Linia 302: | Linia 303: | ||
return sub; | return sub; | ||
} | } | ||
- | </cpp> | + | |
+ | 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 === | === Wywoływanie funkcji C++ w kodzie Lua === | ||
- | BUUU | + | |
+ | Spróbujmy zrobić wykonać to samo zadanie odwrotni. Wywołajmy funkcję napisaną w C++ w kodzie Lua. Funkcje w Lua są wywoływane używając wskaźnika na funkcję: | ||
+ | |||
+ | ''typedef int (*lua_CFunction) (lua_State *L);'' | ||
+ | |||
+ | Wynika z tego, że funkcje przyjmują jako argument interpretator Lua i zwracają wartość int. Napiszmy funkcję w C++, która będzie liczyła sumę liczb przekazanych do funkcji, których liczba będzie zmienna: | ||
+ | |||
+ | **Listing 9** Funkcja liczącą sumę podanych liczb w C++ wywoływana z poziomu kodu Lua. | ||
+ | |||
+ | <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 przygotowana do wywołania w kodzie Lua | ||
+ | static int suma(lua_State *L) | ||
+ | { | ||
+ | // pobranie liczby argumentów | ||
+ | int n = lua_gettop(L); | ||
+ | |||
+ | int suma = 0; | ||
+ | |||
+ | // sumowanie argumentów | ||
+ | for (int i = 0; i < n; ++i) | ||
+ | suma += lua_tonumber(L, i); | ||
+ | |||
+ | // zwrócenie sumy | ||
+ | lua_pushnumber(L, suma) | ||
+ | |||
+ | // zwracamy ilość wartości zwracanych przez funkcję | ||
+ | return 1; | ||
+ | } | ||
+ | |||
+ | |||
+ | 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, "zpr.lua")) | ||
+ | { | ||
+ | // Walidacja wcztania skryptu | ||
+ | std::cout << "Error while running script: " << lua_tostring(L, -1) << std::endl; | ||
+ | return 1; | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | // zamknięcie maszyny wirtualnej | ||
+ | lua_close(L); | ||
+ | return 0; | ||
+ | |||
+ | } | ||
+ | |||
+ | </code> | ||
+ | |||
+ | |||
+ | **Listing 10** Przykład wywołania w skrypcie Lua funkcji napisanych w C++ | ||
+ | <code cpp> | ||
+ | |||
+ | --zpr.lua | ||
+ | srednia , sum = f_srednia(10, 20, 30, 40, 50) | ||
+ | print("Srednia wynosi: ", srednia) | ||
+ | </code> | ||
+ | |||
==== Więcej informacji ==== | ==== Więcej informacji ==== |