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

部分内容查阅自:《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. Golang切片的三种简单使用方式及区别

    概念 切片(slice)是建立在数组之上的更方便,更灵活,更强大的数据结构.切片并不存储任何元素而只是对现有数组的引用. 三种方式及细节案例 ①定义一个切片,然后让切片去引用一个已经创建好的数组 pa ...

  2. ORA-38301:can not perform DDL/DML Over Object in Recycle Bin 11.2.0.4

    我们最近有两台测试服务器在oci direct load期间出现下列异常: 从表象上看,是我们在对表执行ddl操作,确实内部也是用了truncate table XXX,可是这个XXX并不是回收站里面 ...

  3. 【题解】Luogu P2604 [ZJOI2010]网络扩容

    原题传送门:P2604 [ZJOI2010]网络扩容 这题可以说是板题 给你一个图,先让你求最大流 再告诉你,每条边可以花费一些代价,使得流量加一 问至少花费多少代价才能使最大流达到k 解法十分简单 ...

  4. 【题解】Luogu P2605 [ZJOI2010]基站选址

    原题传送门:P2604 [ZJOI2010]基站选址 看一眼题目,变知道这题一定是dp 设f[i][j]表示在第i个村庄修建第j个基站且不考虑i+1~n个村庄的最小费用 可以得出f[i][j] = M ...

  5. python 爬取历史天气

    python 爬取历史天气 官网:http://lishi.tianqi.com/luozhuangqu/201802.html # encoding:utf-8 import requests fr ...

  6. get与post需要注意的几点 (转)

    get与post需要注意的几点 在面试或者笔试时,经常会被问到 HTTP 方法中 get 和 post 的异同点.本文简单整理归纳了一下,以备忘. 1."get/post" VS ...

  7. 20145325张梓靖 《网络对抗技术》 PC平台逆向破解

    20145325张梓靖 <网络对抗技术> PC平台逆向破解 学习任务 shellcode注入:shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并 ...

  8. Git冲突与解决方法【转】

    本文转载自:https://www.cnblogs.com/gavincoder/p/9071959.html Git冲突与解决方法 1.git冲突的场景 情景一:多个分支代码合并到一个分支时: 情景 ...

  9. 為什麼gnome-terminal中不能使用ctrl_shift_f來進行查找? 是因為 跟输入法的全局设置衝突了!

    但是,也要注意, 为什么ctrl+shift_f有时候可以使用, 有时候又不可以使用? 是因为, 这个跟输入法的状态有关, 如果输入法是英文, 那么中文的 "简体/繁体切换快捷键ctrl+s ...

  10. (转)开源项目miaosha(上)

    石墨文档:https://shimo.im/docs/iTDoZs4CVfICgSfV/ (二期)19.开源秒杀项目miaosha解读(上) [课程19]几张图.xmind0.6MB [课程19]开源 ...