zoukankan      html  css  js  c++  java
  • Lua 栈的理解

    提到C++与lua互调,不可不提栈。

    栈是C++和Lua相互通讯的一个地方。

    首先这个栈并不是传统意义上的栈(传统的栈需要放同一种数据类型,但在网上的某些资料说,每个栈元素是一个联合体)。

    栈从上向下分别是-1,-2,-3... ; 从下向上分别是1,2,3...

    这也就是lua_gettop为什么可以获得栈中总元素数的原因。因为lua_gettop()获得的是从下向上栈顶的索引,因为从1开始,栈顶的索引也即是总元素数。

    1.

    lua_getglobal(L,“lua变量名");

    这个函数会将lua中的某变量放置到栈顶,于是C++就可以取了。

    2.

    lua_tointeger(L, "某索引")

    将某索引的栈中元素取得(并不出栈),索引可为正或者负。

    同系列的还有lua_toboolean,lua_tostring等。

    3.

    lua_call(L,参数个数,返回值个数)

    在调用之前,要将函数名,各个参数,分别入栈。

    4.

    lua_register

    将某C函数注册(建立与lua函数的关联关系 )

    可以想象内部有一个map<string(lua函数名) ,C函数指针>

    要注意 函数的返回值要是int ,参数要是lua_State*

    查看lua_CFunction的定义,就明白为什么了。

     

     

    5.打印整个栈

    这个是很重要的一个技巧,尤其在初学阶段。

    我就曾经被网上一段错误代码弄的百思不得其解,后来通过打印栈的方式,明白他写的是错的。

    而且通过打印栈我还发现,调用luaopen_base(L)系列函数时,每调用一个,会在栈中push一个table

    这也就是为什么说lua所有变量,函数(函数其实也是变量),

    都在lua_State中的原因。

    //该函数来自网络
    void stackDump(lua_State* L)
    {
        int i;
        int top = lua_gettop(L);
        printf("stackDump(num=%d):
    ",top);
        
        for (i = 1; i <= top; i++) {  /* repeat for each level */
            int t = lua_type(L, i);
            switch (t) {
                    
                case LUA_TSTRING:  /* strings */
                    printf("`%s'", lua_tostring(L, i));
                    break;
                    
                case LUA_TBOOLEAN:  /* booleans */
                    printf(lua_toboolean(L, i) ? "true" : "false");
                    break;
                    
                case LUA_TNUMBER:  /* numbers */
                    printf("%g", lua_tonumber(L, i));
                    break;
                    
                default:  /* other values */
                    printf("%s", lua_typename(L, t));
                    break;
                    
            }
            printf("  ");  /* put a separator */
        }
        printf("
    ");     /* end the listing */
        
    }

     

  • 相关阅读:
    springcloud系列五 feign远程调用服务
    ribbon负载均衡
    使用RestTemplate时报错java.lang.IllegalStateException: No instances available for 127.0.0.1
    HBase介绍
    HBase单机模式安装
    HDFS介绍及简单操作
    zookeeper三种模式安装详解(centos 7+zookeeper-3.4.9)
    zookeeper介绍
    hadoop搭建伪分布式集群(centos7+hadoop-3.1.0/2.7.7)
    linux配置本地yum源
  • 原文地址:https://www.cnblogs.com/fox7nights/p/3446833.html
Copyright © 2011-2022 走看看