首页 > 其他 > 详细

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

时间:2020-03-13 13:36:20      阅读:64      评论:0      收藏:0      [点我收藏+]

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\n", 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\n", lua_gettop(L));
23 
24     printf("%s\n", lua_tostring(L, 1));
25     printf("%s\n", lua_tostring(L, 2));
26     printf("%s\n", lua_tostring(L, 3));
27     printf("%s\n", 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个元素了)

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!