①C++往lua堆栈里面写东西
②lua获取这些堆栈的数据后,拿到lua全局表进行操作
③lua在全局表拿到结果后,再把结果返回到lua堆栈中
④C++再去读取lua堆栈信息
(1)传递参数类型
数字、字符串、bool、用户类型
(2)获取返回值类型
数字、字符串、bool、结构体对象
#include
#include
//定义函数
//lua_State状态,我们通过状态来操作堆栈、调试、内存监控
int CTest(lua_State* L)
{
printf("int CTest\n");
return 0;//返回结果个数,
//返回0表示没有返回值,返回一表示一个参数
}
int main(int argc,char* argv[])
{
lua_State* lua = lua_open();
luaopen_base(lua);
luaopen_string(lua);
luaopen_table(lua);
//注册函数,告诉lua我写了这个函数
lua_register(lua,"CTest",CTest);//CTest是名称,可以和函数名是不一致的,可以自己定义的
if(luaL_loadfile(lua,"main.lua"))
{
const char* error = lua_tostring(lua,-1);
printf("lua load error:%s\n",error);
}
}
CTest()
CTest("lua string",123,true)
int CTest(lua_State* L)
{
size_t len = 0;
const char* str = lua_tolstring(L,1,&len);//返回栈顶的字符串,
//并返回字符串的长度放到len里面
printf("lua name = %s",str);
return 0;
}
int CTest(lua_State* L)
{
int age = 0;
age = lua_tonumber(L,2);
printf("age = %d\n",age);
}
int CTest(lua_State* L)
{
bool is = lua_toboolean(L,3);
printf("bool is = %d",is);
}
local arr = {"A001","A002","A003","A004"};
CTestArr(arr);
#include
#include
int CTestArr(lua_State* L)
{
printf("In CTestArr\n");
int arr_len = luaL_getn(L,1);//获取lua栈底表的大小
for(int i = 0; i < len; ++i)
{
lua_pushnumber(L,i);//往栈顶压入整数
lua_gettable(L,1);//栈顶元素出栈,并放到表的i的位置
size_t size;
printf("%s\n",lua_tolstring(L,-1,&size));//打印栈顶元素
lua_pop(L,1); //栈顶元素出栈
}
return 0;
}
int main(int argc,char* argv[])
{
lua_State* lua = lua_open();
luaopen_base(lua);
luaopen_string(lua);
luaopen_table(lua);
//注册函数,告诉lua我写了这个函数
lua_register(lua,"CTest",CTest);//CTest是名称,可以和函数名是不一致的,可以自己定义的
lua_register(lua,"CTestArr",CTestArr);
if(luaL_loadfile(lua,"main.lua"))
{
const char* error = lua_tostring(lua,-1);
printf("lua load error:%s\n",error);
}
}
从做到右,栈顶→栈底
①arr
② 1 arr
③ arr
arr = {“A001”,“A002”,“A003”,“A004”,1}
打印栈顶A001
④ 2 arr
⑤ arr
arr = {“A002”,“A003”,“A004”,1,2} //压入表尾
打印栈顶A002
⑥A002从栈顶弹栈
lua_next(L,3)函数说明
1)先从栈顶弹出一个key
2)从栈指定位置的table里取下一对key-value,先将key入栈再将value入栈
3)如果第二步成功返回非0;否则返回0,并且不向栈中压入任何值
函数代码
int CTestTable(lua_State* L)
{
lua_pushnill(L);//在栈顶插入一个空值,防止把原先的表弹出去
while(lua_next(L,1)!=0) //返回0表示结束
{
printf("key = %s ",lua_tostrin(L,-2));//先插入的key。后插入的value
printf("value = %s",lua_tostrin(L,-1)); //打印value
lua_pop(L,1);//顺便把value从栈底出站,函数从栈顶开始移除
}
return 0;
}
int main(int argc,char* argv[])
{
lua_State* lua = lua_open();
luaopen_base(lua);
luaopen_string(lua);
luaopen_table(lua);
lua_register(lua,"CTestTable",CTestTable);
}
local tab = {name = "xiaoming",age = "22",id = “007” }
CTestTable(tab);
①当n为-1时 lua_settop(L,0) 移除所有元素 ,正常
当n<-1 时,-(n)-1为正数,堆栈可能会高于原来的堆栈,此时却压入了新的栈,lua不会报错。违背了lua_pop的初衷。
②当n>0时,-(n)-1 等于负数,从栈顶开始移除n个参数,但是 -n-1不得超过栈底,会报错,及n不能超过当前栈中个数。
③如果不想从栈顶为起点移除除元素,而是移除从栈底起指定元素到栈顶的所有元素,直接用lua_settop即可。
lua_getfield(L,3,"name");//把name对应的值value压入栈顶
printf("%s \n",lua_tostring(L,-1));
int CTestTabble(lua_State* L)
{
lua_getfield(L,1,"name");//name是第一个参数
//,是栈底的位置
printf("%s \n",lua_tostring(L,-1));//会把value压入到栈顶
}