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

部分内容查阅自:《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 = {,6.78,"array string"}

②C++中读取

 //lua->stack,得到全局数组,位置-1
lua_getglobal(L, "global_c_read_array"); //得到数组长度
lua_Integer array_len = luaL_len(L, -);
for (lua_Integer i = ; i <= array_len; ++i){
//lua->stack,全局数组位置-1,然后i为对应的索引值,将返回值放到-1的位置
int ret_type = lua_rawgeti(L, -, i); //--------------被替代的原操作table函数-------------
//lua_pushinteger(L, i);
//int ret_type = lua_gettable(L, -2); //也可以使用int ret_type = lua_rawget(L, -2); //stack->c
if (ret_type == LUA_TNUMBER){
if (lua_isinteger(L, -)){
printf("%lld\n", lua_tointeger(L, -));
}
else if (lua_isnumber(L, -)){
printf("%g\n", lua_tonumber(L, -));
}
}
else if (ret_type == LUA_TSTRING){
printf("%s\n", lua_tostring(L, -));
} lua_pop(L, );
}

4.C++写入Lua数组

①C++写入

 //c->stack,创建一个新的table放到-1的位置
lua_newtable(L); //c->stack,创建对应的key-val
lua_pushinteger(L, ); //设置值
lua_rawseti(L, -, );//对应key-val lua_pushnumber(L, 8.9); //设置值
lua_rawseti(L, -, );//对应key-val lua_pushstring(L, "test_string");//设置值
lua_rawseti(L, -, );//对应key-val //--------------被替代的原操作table函数-------------
//lua_pushinteger(L, 1); //设置key
//lua_pushinteger(L, 7);//设置值
//lua_settable(L, -3); //也可以使用lua_rawset(L,-3); //lua_pushinteger(L, 2); //设置key
//lua_pushnumber(L, 8.9);//设置值
//lua_settable(L, -3); //也可以使用lua_rawset(L,-3); //lua_pushinteger(L, 3); //设置key
//lua_pushstring(L, "test_string");//设置值
//lua_settable(L, -3); //也可以使用lua_rawset(L,-3); //stack->lua,将数组赋值到lua中,并弹出数组
lua_setglobal(L, "global_c_write_array");

②在hello.lua文件中Lua读取

 if global_c_write_array then
for i = , #global_c_write_array do
print("v = ", global_c_write_array[i])
end
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++注册的类

Lua和C++交互 学习记录之五:全局数组交互的更多相关文章

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

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...

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

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...

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

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...

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

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...

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

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 在 ...

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

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...

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

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...

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

    主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...

  9. SpringMVC学习记录七——sjon数据交互和拦截器

    21       json数据交互 21.1      为什么要进行json数据交互 json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便. 比如:webservi ...

随机推荐

  1. django加载静态文件

    在一个网页中,不仅仅只有一个 html 骨架,还需要 css 样式文件. js 执行文件以及一些图片等,因此在 DTL 中加载静态文件是一个必须要解决的问题.在 DTL 中,使用 static 标签来 ...

  2. P2387 [NOI2014]魔法森林(LCT)

    P2387 [NOI2014]魔法森林 LCT边权维护经典题 咋维护呢?边化为点,边权变点权. 本题中我们把边对关键字A进行排序,动态维护关键字B的最小生成树 加边后出现环咋办? splay维护最大边 ...

  3. 树莓派dhcp server

    首先安装isc-dhcp-server apt-get install isc-dhcp-server 然后编辑配置文件,选择需要开启dhcp服务器的网卡 vi /etc/default/isc-dh ...

  4. MySql数据库概念

    一.什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. 简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行 ...

  5. php 输出缓存,每秒打印一个数字

    <?php set_time_limit(0); //以上三行不加上nginx下不执行,一次性显示出来 header('Content-Type: text/event-stream'); // ...

  6. 【python011--数组2】

    一.从列表中获取元素 *跟数组一样,我们可以通过元素的索引值(index)从列表获取单个元素,注意,列表索引值是从0开始的 >>> member= ['尘封','冰点','无名',' ...

  7. Python3 tkinter基础 Frame bind 鼠标移动事件 实时显示鼠标的位置

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  8. HDU 1689 Just a Hook (线段树区间更新+求和)

    Just a Hook Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible ...

  9. 论文笔记:Attention Is All You Need

    Attention Is All You Need 2018-04-17 10:35:25  Paper:http://papers.nips.cc/paper/7181-attention-is-a ...

  10. AngularJS 笔记2

    2017-03-23 本文更新链接: http://www.cnblogs.com/daysme/p/6613071.html $http angularjs中的ajax 向服务器请求数据 1/2 后 ...