Добавление в Lua функции из c++

1.07.2010. c++, Lua

0

Одним из достоинств lua-скриптов является то, что из них можно вызывать функции, написанные на c/c++.

Объявление функции:

int func(lua_State  *l);

После объявления о функции необходимо сообщить lua-интерпритаторы.

lua_register(l, "smile", func);

Первый параметр - указатель на экземпляр lua-интерпритатора, второй — имя функции, которой передается параметр, третий параметр — имя c/c++ функции, которая будет выполняться из lua
Теперь немного об обмене параметрами между lua-скриптом и нашей функцией.
Обмен между lua и основной программой осуществляется через стек. Количество параметров, передаваемых от скрипта фактически не ограничено и не является постоянным. Можно передать 1 параметр, а можно 20;)

int count = lua_gettop(l); //получаем количество переданных 
//параметров (и одновременно номер последнего элемента)

Теперь, когда мы знаем, сколько нам передали параметров можно получать и их самих:
Если вы точно знаете, какой тип данных и каким по счету вам передали, то для получения данного элемента можно использовать функцию lua_totype(l,n), где type — тип данных (number, string, nil, etc), а n — номер параметра (нумерация начинается с 1, а не с 0)
Для проверки типа данных можно использовать функцию lua_istype(l,n)
Большинство функций должны что-либо возвращать. Для того, чтоб передать lua возвращаемые параметры опять необходимо использовать стек, только теперь не читать его, а писать в него:
lua_pushtype(l, data) — вместо data — либо переменная, либо строчка заданного типа, type заменяется на тип (number,string)
Функции в lua могут возвращать несколько параметром. Количество возвращаемых функцией параметров возращается как результат ее работы:

return n;

Пример приметивной программы, считающий сумму чисел от 1 до переданного параметра:

#include <iostream>
#include "lua5.1/lua.hpp"
using namespace std;
 
int func(lua_State *l);
int main()
{
lua_State *l = lua_open();
luaL_openlibs(l);
lua_register(l, "sum", func); // регистрируем функцию,
//которая в lua будет иметь имя sum
luaL_dofile(l,"script.lua");
 
lua_close(l);
return 0;
}
int func(lua_State *l)
{
 
int count = lua_gettop(l); // получаем количество
// переданных параметров
if (count&lt;1){lua_pushstring(l,"Error"); return 0;} //если нам не передали
// параметров, то good bye
 
for (int j=0;j&lt; count;j++)
{
if (lua_isnumber(l,j+1)) //если число, то
{int n=lua_tonumber(l,j+1); // получаем j-тый
// переданный параметр
lua_pushnumber(l,(n*(n+1))/2); // сумма чисел
// от 1 до n — n*(n+1)/2
}
}
return count;
};
</iostream>
sums={sum(1,2,3,4,5,6,7,8,9,10)}; -- создаем массив sums,
-- состоящий из возвращенных функцией sum параметров
for i=1,10,1 do
io.write("Сумма от 1 до "..i.." "..sums[i].."\n");
end

Hello World: Lua и C++

29.06.2010. c++, Lua

0

Lua - простой и  удобный интерпретируемый язык программирования, позволяющий легко добавить скрипты в вашу программу.

Скачать и установить lua можно отсюда. Пользователи ubuntu/debian могут установить из репозитория:
sudo aptitude install lua5.1 liblua5.1-dev

Теперь создайте новый проект на c++ в своей IDE, затем создайте новый файл: script.lua

Для использования в c++ скриптов на lua необходимо подключить файл lua.hpp:

#include "lua.hpp" // или <lua.hpp>, "lua5.1/lua.hpp", в зависимости от того, как у вас установлен lua

Тем, кто пишет на c необходимо вместо #include "lua.hpp" написать:

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

Также вам необходимо подключить библиотеку lua (liblua5.1.so в linux или lua51.lib в Windows).

Теперь инициализируем lua:

lua_State *l = lua_open();
luaL_openlibs(l);

Далее создаем lua-скрипт: создаем новый файл script.lua и пишем в нем print "Hello World!!!"

Для испольнения этого скрипта в программе на c/c++ существует специальная функция:

luaL_dofile(указатель на экземпляр lua, имя или путь к файлу со скриптом);

После работы с lua надо не забыть его закрыть:

lua_close(l);

Теперь, если вы все сделали правильно, после запуска программы вы увидети строчку "Hello World!!!"

Программа польностью:
main.cpp:

#include &lt;iostream&gt;
#include "lua5.1/lua.hpp"
using namespace std;
 
int main()
{
    lua_State *l = lua_open();
    luaL_openlibs(l);
    luaL_dofile(l,"script.lua");
 
    lua_close(l);
    return 0;
}

script.lua:

print "Hello World";

Страница 1 из 11

Rambler's Top100 Блогун - монетизируем блоги