C与lua交互--lua调用栈分析(2)

0 预备知识:

 至少对Lua手册C API有简单的了解。lua5.3手册中文

1  Lua虚拟机的栈,如图:

假设虚拟机的栈有n个数据:

 解释:

两种解释方式:

A,栈顶开始, -1 ...-n

B,栈底开始,1 ...n

二、运行原理和调用栈机制实例

创建main.lua

1 function LuaFunc(a)
2     return 1+a,2,3,4;
3 end

C++

 1 //①新建虚拟机  
 2     lua_State* L = luaL_newstate();
 3     //②载入库  
 4     luaL_openlibs(L);
 5 
 6     //③这里执行 test.lua  Lua文件  
 7     luaL_dofile(L, "main.lua");
 8 
 9     //④重新设置栈底
10     lua_settop(L, 0);
11 
12     //⑤获取 返回结果  
13     lua_getglobal(L, "LuaFunc");
14     // 打印结果:4
15     printf("栈顶的索引:%d
", lua_gettop(L));
16     lua_pushinteger(L, 14);
17 
18     //⑥操作栈调回结果
19     lua_pcall(L, 1, 4, 0);
20 
21     //此时你会发现栈内有4个元素
22     printf("lua_gettop %d
", lua_gettop(L));
23 
24     printf("%s
", lua_tostring(L, 1));
25     printf("%s
", lua_tostring(L, 2));
26     printf("%s
", lua_tostring(L, 3));
27     printf("%s
", lua_tostring(L, 4));
28 
29     //⑦一定记得关闭虚拟机  
30     lua_close(L); 
31 
32     system("pause");
33     return 0;

运行结果:

分析:

1-3,准备环境,执行Lua文件

4,重新设置栈底

5,获取函数LuaFunc,并且压如栈(栈内有1个元素了),lua_pushinteger将14压入栈(栈内有2个元素了)

6,pop出栈的函数,参数(栈内有0个元素了),计算得到的结果,15,2,3,4 分别压入栈(栈内有4个元素了)

原文地址:https://www.cnblogs.com/Jaysonhome/p/12485649.html