lua调用CPP函数
普通参数
int CTest(lua_State* lua)
{
size_t len;
//获取字符串参数
const char* str= lua_tolstring(lua, 1, &len);
printf("str=%s len=%d\n",str,len);
//获取数字参数
int num = lua_tonumber(lua, 2);
printf("num=%d\n", num);
//获取bool参数
bool b = lua_toboolean(lua, 3);
printf("b=%d\n", b);//1
return 0;
}
//lua注册函数
lua_register(L, "CTest", CTest);
CTest("hello lua",123,true)
参数是数组
int GetArr(lua_State* lua)
{
int n = luaL_getn(lua, 1);
printf("数组长度:%d\n", n);
for (int i=1;i<=n;i++)
{
lua_pushnumber(lua, i);//将index压栈,作为key
lua_gettable(lua, -2);//把栈顶的index换成元素
size_t size;
printf("%s\n", lua_tolstring(lua, -1, &size));//输出栈顶
lua_pop(lua, 1);//出栈1个
}
return 0;
}
lua_register(L, "GetArr", GetArr);
参数是表
//遍历表
int GetAllTable(lua_State* lua)
{
//先加一个用于弹出
lua_pushnil(lua);
//lua_next会弹出一个key,再压入下一个key,压入value
while (lua_next(lua, 1) != 0)
{
printf("%s:", lua_tolstring(lua, -2, NULL));//key
printf("%s\n", lua_tolstring(lua, -1, NULL));//value
lua_pop(lua,1);//把value弹出
}
return 0;
}
//获取指定元素
int GetTable(lua_State* lua)
{
lua_pushstring(lua, "Table");//压入key
lua_gettable(lua, -2);
lua_pushstring(lua, "name");//压入key
lua_gettable(lua, -2);//将栈顶作为key,将栈顶换为对应值
printf("%s\n", lua_tolstring(lua, -1, NULL));
lua_pop(lua, 1);
lua_pushstring(lua, "age");
lua_gettable(lua, -2);
printf("%s\n", lua_typename(lua, lua_type(lua, -1)));
printf("%s\n", lua_tolstring(lua, -1, NULL));
printf("%s\n", lua_typename(lua, lua_type(lua, -1)));
return 0;
}
//直接获取指定元素
int GetValue(lua_State* lua)
{
//获取
lua_getfield(lua, -1, "name");
if (lua_type(lua,-1) ==LUA_TSTRING)//类型检测
{
printf("%s\n", lua_tolstring(lua, -1, NULL));
}
else {
printf("不是string类型");
}
return 0;
}
lua_register(L, "GetTable", GetTable);
lua_register(L, "GetAllTable", GetAllTable);
lua_register(L, "GetValue", GetValue);
Table={name="airjronda",age=13}
GetAllTable(Table)
Tab={Table=Table}
GetTable(Tab)
GetValue(Table)
带返回值
//返回值是string
int TestReturnOne(lua_State* lua)
{
lua_pushstring(lua, "the value");
return 1;//返回栈顶元素
}
//返回table
int ReturnTable(lua_State* lua)
{
lua_newtable(lua);
lua_pushstring(lua, "name");
lua_pushstring(lua, "ccc");
lua_settable(lua, -3);
lua_pushstring(lua, "age");
lua_pushnumber(lua, 11);
lua_settable(lua, -3);
return 1;
}
lua_register(L, "TestReturnOne", TestReturnOne);
lua_register(L, "ReturnTable", ReturnTable);
local res=TestReturnOne()
print("return:"..res)
local tb2=ReturnTable();
print("name:"..tb2["name"])
print("age:"..tb2["age"])
print(Table["name"])
Cpp调用lua
读取lua变量
//读取number
void GetWidth(lua_State* lua) {
lua_getglobal(lua, "width");//获取参数width
int width = lua_tonumber(lua, -1);//将栈顶转为number
printf("width=%d", width);
}
//读取table
void GetTableValue(lua_State* lua) {
lua_getglobal(lua, "conf");
lua_getfield(lua, -1, "address");
//if (lua_type(lua, -1) == LUA_TSTRING)//类型检测
//{
printf("address=%s\n", lua_tostring(lua, -1));
//}
lua_pop(lua,1);
lua_getfield(lua, -1, "password");
if (lua_type(lua, -1) == LUA_TSTRING)//类型检测
{
printf("password=%s\n", lua_tolstring(lua, -1, NULL));
}
lua_pop(lua, 1);
lua_getfield(lua, -1, "age");
if (lua_type(lua, -1) == LUA_TNUMBER)//类型检测
{
printf("age=%d\n", lua_tonumber(lua, -1));
}
lua_pop(lua, 1);
}
width=1920
conf={address="123.123.1.23",password="00adsf",age=11}
cpp创建全局变量
//创建string变量
lua_pushstring(L, "test");
lua_setglobal(L, "version");//将栈顶设置为全局变量
//cpp给lua创建全局表
void CreateGlobleTable(lua_State* lua) {
lua_newtable(lua);
lua_pushstring(lua, "name");
lua_pushstring(lua, "xiao");
lua_settable(lua, -3);
lua_pushstring(lua, "age");
lua_pushnumber(lua, 12);
lua_settable(lua, -3);
lua_pushstring(lua, "tel");
lua_pushstring(lua, "12312312312");
lua_settable(lua, -3);//将栈顶为value,栈第二位key,加入表中,-3为表的位置,表弹至栈顶
lua_setglobal(lua, "Person");
}
print("version="..version)
print("name="..Person["name"])
print("age="..Person["age"])
print("tel="..Person["tel"])
调用方法无参无返回值
lua_State* L = lua_open();
luaL_openlibs(L);
//读取lua脚本
if(luaL_loadfile(L, "K:/main.lua"))
{
const char *error = lua_tostring(L, -1);
printf("%s\n", error);
lua_pop(L, 1);//将错误信息弹出
}
//执行脚本
lua_pcall(L,0,0,0);
//将方法压到栈顶
lua_getglobal(lua, "Event");
//执行lua方法,0参数,0返回值,0错误调用
//成功返回0
if (lua_pcall(L, 0, 0, 0)!=0)
{
const char *error = lua_tostring(L, -1);
printf("%s\n", error);
lua_pop(L, 1);//将错误信息弹出
}
function Event()
print("lua de function")
end
调用有参有返回值
void DoLuaEventArgOne(lua_State* lua) {
lua_getglobal(lua, "Event1");
lua_pushstring(lua, "arg1");//压入栈顶,参数1。压栈先后为参数顺序
if (lua_pcall(lua, 1, 1, 0) != 0)
{
const char *error = lua_tostring(lua, -1);
printf("%s\n", error);
lua_pop(lua, 1);//将错误信息弹出
}
else {
printf("return:%s\n", lua_tostring(lua, -1));//返回值在栈顶
lua_pop(lua, 1);//将返回值弹出
}
}
function Event1(arg)
print(arg)
return "_res"
end
错误调用
int ErrLoc = lua_gettop(lua);//错误调用方法的位置
lua_getglobal(lua, "ErrorFun");
ErrLoc++;
lua_getglobal(lua, "Event");
lua_pcall(lua, 0, 0, ErrLoc);
lua_pop(lua,1);//错误方法出栈
function Event()
print("lua de function")
loacl b=1/0
end
参数返回值是表
void DoLuaEventTab(lua_State* lua) {
int ErrLoc = lua_gettop(lua);//错误调用方法的位置
lua_getglobal(lua, "ErrorFun");
ErrLoc++;
lua_getglobal(lua, "Event2");
//参数是表
lua_newtable(lua);
lua_pushstring(lua, "key");
lua_pushstring(lua, "value");
lua_settable(lua, -3);
if (lua_pcall(lua, 1, 1, ErrLoc));
//获取返回值
lua_getfield(lua, -1, "id");
printf("res:%d", (int)lua_tonumber(lua,-1));
}
function Event2(arg)
print(arg.key)
print(arg["key"])
local t={id=123}
return t
end