zoukankan      html  css  js  c++  java
  • Lua和C++交互 学习记录之五:全局数组交互

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍)

    部分内容查阅自:《Lua 5.3  参考手册》中文版 译者 云风 制作 Kavcc

     

    vs2013+lua-5.3.3

     

    1.数组

    ①数组是key值从1开始并连续递增的table。

    ②索引号是从1开始,不是从0开始。

     

    2.既然是table,那当然是可以用上一节的内容进行读写的。

    lua还提供了一些只针对数组进行操作的API,如下:

    ①LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx);

    使用于数组,可得到数组元素个数;

    以数字形式返回给定索引处值的“长度”; 它等价于在 Lua 中调用 '#' 的操作。(非数组使用#将得不到正确的值)

    如果操作结果不是一个整数,则抛出一个错误。(这种情况只发生在触发元方法时。)

     

    ②LUA_API int (lua_rawgeti) (lua_State *L, int idx, lua_Integer n);

    注意对应的lua_rawget函数。

    获取索引号n的数组值,返回的int值为值的类型。

    这是一次直接访问,不会触发元方法,效率高。

     

    ③LUA_API void  (lua_rawseti) (lua_State *L, int idx, lua_Integer n);

    注意对应的lua_rawset函数

    设置索引号n的数组值。

    这个函数会将值弹出栈。 赋值是直接的;即不会触发元方法,效率高。

     

    3.C++读取Lua中数组

    ①Lua中数组

    global_c_read_array = {5,6.78,"array string"}

    ②C++中读取

     1 //lua->stack,得到全局数组,位置-1
     2     lua_getglobal(L, "global_c_read_array");
     3 
     4     //得到数组长度
     5     lua_Integer array_len = luaL_len(L, -1); 
     6     for (lua_Integer i = 1; i <= array_len; ++i){
     7         //lua->stack,全局数组位置-1,然后i为对应的索引值,将返回值放到-1的位置
     8         int ret_type = lua_rawgeti(L, -1, i);
     9 
    10         //--------------被替代的原操作table函数-------------
    11         //lua_pushinteger(L, i);
    12         //int ret_type = lua_gettable(L, -2); //也可以使用int ret_type = lua_rawget(L, -2);    
    13 
    14         //stack->c
    15         if (ret_type == LUA_TNUMBER){
    16             if (lua_isinteger(L, -1)){
    17                 printf("%lld
    ", lua_tointeger(L, -1));
    18             }
    19             else if (lua_isnumber(L, -1)){
    20                 printf("%g
    ", lua_tonumber(L, -1));
    21             }
    22         }
    23         else if (ret_type == LUA_TSTRING){
    24             printf("%s
    ", lua_tostring(L, -1));
    25         }
    26 
    27         lua_pop(L, 1);
    28     }

     

    4.C++写入Lua数组

    ①C++写入

     1 //c->stack,创建一个新的table放到-1的位置
     2     lua_newtable(L);
     3 
     4     //c->stack,创建对应的key-val
     5     lua_pushinteger(L, 7); //设置值
     6     lua_rawseti(L, -2, 1);//对应key-val
     7 
     8     lua_pushnumber(L, 8.9); //设置值
     9     lua_rawseti(L, -2, 2);//对应key-val
    10 
    11     lua_pushstring(L, "test_string");//设置值
    12     lua_rawseti(L, -2, 3);//对应key-val
    13 
    14     //--------------被替代的原操作table函数-------------
    15     //lua_pushinteger(L, 1); //设置key
    16     //lua_pushinteger(L, 7);//设置值
    17     //lua_settable(L, -3); //也可以使用lua_rawset(L,-3);
    18 
    19     //lua_pushinteger(L, 2); //设置key
    20     //lua_pushnumber(L, 8.9);//设置值
    21     //lua_settable(L, -3); //也可以使用lua_rawset(L,-3);
    22 
    23     //lua_pushinteger(L, 3); //设置key
    24     //lua_pushstring(L, "test_string");//设置值
    25     //lua_settable(L, -3); //也可以使用lua_rawset(L,-3);
    26 
    27     
    28     //stack->lua,将数组赋值到lua中,并弹出数组
    29     lua_setglobal(L, "global_c_write_array");

    ②在hello.lua文件中Lua读取

    1 if global_c_write_array then
    2     for i = 1, #global_c_write_array do
    3         print("v = ", global_c_write_array[i])
    4     end
    5 end

     

    Lua和C++交互系列:

    Lua和C++交互 学习记录之一:C++嵌入脚本

    Lua和C++交互 学习记录之二:栈操作

    Lua和C++交互 学习记录之三:全局值交互

    Lua和C++交互 学习记录之四:全局table交互

    Lua和C++交互 学习记录之五:全局数组交互

    Lua和C++交互 学习记录之六:全局函数交互

    Lua和C++交互 学习记录之七:C++全局函数注册为Lua模块

    Lua和C++交互 学习记录之八:C++类注册为Lua模块

    Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类

  • 相关阅读:
    第06组 每周小结 (1/3)
    第06组 Beta冲刺 总结
    第06组 Beta冲刺(5/5)
    爬虫第六次作业
    第06组 Beta冲刺 (4/5)
    第06组 Beta冲刺 (3/5)
    第06组 Beta冲刺 (2/5)
    《机器学习》第二次作业——第四章学习记录和心得
    软工实践个人总结
    第09组 每周小结 (3/3)
  • 原文地址:https://www.cnblogs.com/chevin/p/5891836.html
Copyright © 2011-2022 走看看