lua和C++交互
普通参数
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);
GetArr(Arr)
参数是表
//遍历表 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