全局变量访问(普通,表),函数调用(参数,返回值)
注意栈空间清理,防止内存泄露
访问普通全局变量
//需要在lua代码执行后执行
int LuaTestGlobal(lua_State* L) {
lua_getglobal(L, "width");
int w = lua_tonumber(L, -1);
lua_pop(L, 1); //恢复现场
printf("width = %d\n", w);
return 0;
}
--lua
width = 1010
设置普通全局变量
//需要在lua代码执行前执行
int LuaTestSetGlobal(lua_State* L) {
lua_pushstring(L, "180");
lua_setglobal(L, "height");
return 0;
}
--lua
print(height)
访问table全局变量
int LuaTestGetTableGlobal(lua_State* L) {
lua_getglobal(L, "conf");
lua_getfield(L, -1, "titlename");
printf("titlename = %s\n", lua_tostring(L, -1));
lua_getfield(L, -2, "height");
printf("width = %.0f\n", lua_tonumber(L, -1));
lua_pop(L, 3);
return 0;
}
--lua
conf = {
titlename = "screen",
width = '1920'
}
设置table全局变量
int LuaTestSetTableGlobal(lua_State* L) {
lua_newtable(L);
lua_pushstring(L, "name");
lua_pushstring(L, "my name is lzx");
lua_settable(L, -3);
lua_pushstring(L, "age");
lua_pushnumber(L, 21);
lua_settable(L, -3);
lua_setglobal(L, "person");
return 1;
}
--lua
print(person.name,person.age)
调用Lua函数
int LuaTestCallFunc(lua_State* L) {
lua_getglobal(L, "event");
lua_pcall(L, 0, 0, NULL);
return 0;
}
--lua
function event()
print('event called!')
end
调用Lua函数 之 错误显示
int LuaTestCallFunc(lua_State* L) {
lua_getglobal(L, "event1");
print_stack(L);
if (lua_pcall(L, 0, 0, 0) != 0) {
//如果不指明,则错误压至栈顶
printf("call event1 failed : %s\n", lua_tostring(L, -1));
lua_pop(L, 1); //恢复栈结构
}
return 0;
}
调用Lua函数 之 传参
int LuaTestCallFunc(lua_State* L) {
lua_getglobal(L, "event");
lua_pushstring(L, "key");
if (lua_pcall(L, 1, 1, 0) != 0) {
//如果不指明,则错误压至栈顶
printf("call event failed : %s\n", lua_tostring(L, -1));
lua_pop(L, 1);
}
else {
printf("call event success : %s\n", lua_tostring(L, -1));
lua_pop(L, 1);
}
return 0;
}
--lua
function event(typ)
print('typ =' ..typ)
return "lua event return"
end
int LuaTestCallErrorHandling(lua_State* L) {
int errfunc = lua_gettop(L);
lua_getglobal(L, "ferror");
errfunc++; //自底向上索引的好处是,可以不用考虑新参数的加入从而导致函数位置的变化
lua_getglobal(L, "event1");
lua_pushstring(L, "key");
if (lua_pcall(L, 1, 1, errfunc) != 0) {
//栈顶为ferror return的东西,倒数第二个是错误处理函数ferror
printf("call event failed : %s\n", lua_tostring(L, -1));
lua_pop(L, 1);
}
else {
printf("call event success : %s\n", lua_tostring(L, -1));
}
lua_pop(L, 1);
return 0;
}
--lua
function ferror(e)
print("error handling");
return "lua change error"
end