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 = {,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模块》
《Lua和C++交互 学习记录之八:C++类注册为Lua模块》
《Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类》
Lua和C++交互 学习记录之五:全局数组交互的更多相关文章
- Lua和C++交互 学习记录之七:C++全局函数注册为Lua模块
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3 参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...
- Lua和C++交互 学习记录之六:全局函数交互
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3 参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...
- Lua和C++交互 学习记录之四:全局table交互
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3 参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...
- Lua和C++交互 学习记录之三:全局值交互
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3 参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...
- Lua和C++交互 学习记录之九:在Lua中以面向对象的方式使用C++注册的类
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3 参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 在 ...
- Lua和C++交互 学习记录之八:C++类注册为Lua模块
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3 参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...
- Lua和C++交互 学习记录之二:栈操作
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3 参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...
- Lua和C++交互 学习记录之一:C++嵌入脚本
主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3 参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1 ...
- SpringMVC学习记录七——sjon数据交互和拦截器
21 json数据交互 21.1 为什么要进行json数据交互 json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便. 比如:webservi ...
随机推荐
- javascript 与 PHP 通信加密,使用AES 128 CBC no padding,以及ios,java,c#文章例子
运行环境 php7.0 不适用于 php7.0以上版本,因为mcrypt_encrypt()函数已删除 为何要采用 no padding 这种形式: AES加密如果原输入数据不够16字节的整数位,就要 ...
- 20145308 《网络对抗》 MSF基础应用 学习总结
20145308 <网络对抗> MSF基础应用 学习总结 实验内容 掌握metasploit的基本应用方式,掌握常用的三种攻击方式的思路.具体需要完成(1)一个主动攻击,如ms08_067 ...
- UVa Live 4670 Dominating Patterns - Aho-Corasick自动机
题目传送门 快速的通道I 快速的通道II 题目大意 给定一堆短串,和一个文本串,问哪些短串在文本串中出现的次数最多. 我觉得刘汝佳的做法,时间复杂度有问题.只是似乎这道题短串串长太短不好卡.比如给出的 ...
- poj 1159 Palindrome - 动态规划
A palindrome is a symmetrical string, that is, a string read identically from left to right as well ...
- 如何在andorid native layer中加log function.【转】
本文转载自:https://blog.csdn.net/powq2009/article/details/39667105 在开发Android一些应用或是链接库, 在程序代码中埋一些log是一定有需 ...
- linux下如何按行将文件切割成多个小文件
答: split -l <行数> <目标文件> <切割后的文件前缀> 举例如下: split -l 1000 jello.txt jello 将jello.txt文 ...
- 89. a^b【快速幂模板】
a^b Description 求 aa 的 bb 次方对 pp 取模的值. 输入格式 三个整数 a,b,pa,b,p ,在同一行用空格隔开. 输出格式 输出一个整数,表示a^b mod p的值. 数 ...
- SpringBoot Mybatis问题收集
1.在SpringBoot中打印mybatis中执行的sql 其实在application.properties 文件下,添加一下配置即可: logging.level.org.springframe ...
- HihoCoder 1636 Pangu and Stones(区间DP)题解
题意:合并石子,每次只能合并l~r堆成1堆,代价是新石堆石子个数,问最后能不能合成1堆,不能输出0,能输出最小代价 思路:dp[l][r][t]表示把l到r的石堆合并成t需要的最小代价. 当t == ...
- 笔记本电脑切换到无线热点无法联网问题&Spring Cloud相关工程启动报错问题
通过禁用本地网络,和禁用另一个无线网络,以及禁用后重开,修改密码,重连的方式均失败后, 使用IE浏览器浏览提示失败,点击诊断,诊断出DNS服务器无响应异常. 突然想到通过ipconfig查看ip,网关 ...