• 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个元素了)

  • 相关阅读:
    instance
    iptables
    centos系统准备
    Leecode no.236 二叉树的最近公共祖先
    Leecode no.235 二叉搜索树的最近公共祖先
    leecode no.98 验证二叉搜索树
    leecode no.109 有序链表转换二叉搜索树
    leecode no.113 路径总和 II
    Leecode no.112 路径总和
    Leecode no.111 二叉树的最小深度
  • 原文地址:https://www.cnblogs.com/Jaysonhome/p/12485649.html
Copyright © 2020-2023  润新知