Добавление в Lua функции из c++
больше не бывает, и умный человек должен стыдиться думать, что вопль газет
может открыть хваленую страну свободы.
-- Л.Берне
Одним из достоинств 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<1){lua_pushstring(l,"Error"); return 0;} //если нам не передали // параметров, то good bye for (int j=0;j< 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
Похожие записи:
- C++. Урок 9. Стандартные алгоритмы для работы с STL (algorithm)
- C++. Урок 1. Знакомство
- C++. Урок 5. Циклы
- Hello World: Lua и C++
- Краткие основы JavaScript
Метки: c c++ lua script Программирование скрипты урок уроки уроки lua уроки с++