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\n", lua_tointeger(L, -1));
18             }
19             else if (lua_isnumber(L, -1)){
20                 printf("%g\n", lua_tonumber(L, -1));
21             }
22         }
23         else if (ret_type == LUA_TSTRING){
24             printf("%s\n", 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
时间: 2024-11-22 17:33:49

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

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

主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.C++调用Lua中函数 ①Lua中的函数 1 function add(x,y) 2 return x + y 3 end ②C++调用函数 1 //lua->stack,全局函数位置-1 2 lua_getglobal(L, "add"); 3 4 //c->stack,传

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

主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.C++读取Lua中的表 ①在hello.lua中设置一个全局表: global_c_read_table = {integer_val = 1,double_val = 2.34,string_val = "test_string"} ②在C++中读取 1 //lua->stack

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

主要内容转载自:子龙山人博客(强烈建议去子龙山人博客完全学习一遍) 部分内容查阅自:<Lua 5.3  参考手册>中文版 译者 云风 制作 Kavcc vs2013+lua-5.3.3 1.首先需要编译出lua库 ①创建一个静态库工程,将lua-5.3.3里的所有文件包含到工程里面去 ②进行编译就可以得到一个lua的静态库,提供给后面的测试项目使用 2.创建学习测试console项目 ①引入上面步骤生成的lua静态库 ②包含lua的所有头文件 ③创建一个hello.lua,里面的内容只有一句

《C专家编程》学习记录——指针和数组相同的地方

一.在普通的表达式中 先看一段简单的代码 char a[8]; a[3]=9; 3[a]=2; printf("a[3] = %d\r\n", a[3]); printf("3[a] = %d\r\n", 3[a]); 结果是: a[3] = 2 3[a] = 2 原因:表达式中的数组名被编译器当做一个指向该数组第一个元素的指针(ANSI C标准),即在表达式中,指针和数组是可以互换的,因为他们在编译器里的最终形式都是指针,并且都可以进行取下标操作.就像加法一样,取

Java 静态内部类与非静态内部类 学习记录.

目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合,我并不是很清楚,留下一些值得思考的问题作为记录,说不定以后能自己来填.于是就会有这篇文章啦. 常规使用方法我也不想介绍,网上一大把,我就说说比较容易错的,值得注意的地方. 注意 这篇文章只是分享一下我对内部类的一些研究与困惑吧,说不定对大家有帮助,说不定能引导大家一起思考学习.Java语法知识其实

AngularJS交互学习教程推荐

0.目录 目录 预览 详述 1 Learn Angular 2 AngularJS入门教程 感悟 声明 1.预览 急着赶时间,没有时间听我废话的同学,直接看今天推荐的两个AngularJS交互学习教程. CodeCademy的LearnAngularJS Fenby的AngularJS入门教程 2.详述 许多研究表明,探究式学习.游戏式学习是较为高效的学习方式,编程语言学习更是如此.正如看电影和玩游戏的区别,你在看电影的时候,你完全处于被动的.接受内容状态,而玩游戏则全然不同,你会和计算机有交互

java学习记录(2):JMenuBar

1.在用这个时候发现很多的组件都有J的前缀,例如Button和JButton,前者是awt包的,后者是swing包的,两者耳朵区别是: AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交互的接口.AWT 中的图形函数与操作系统所提供的图形函数之间有着一一对应的关系,我们把它称为peers. 也就是说,当我们利用 AWT 来构件图形用户界面的时候,我们实际上是在利用操作系统所提供的图形库.由于不同操作系统的图形库所提供的功能

NFC学习记录一

随着电子钱包等的类似需求的提出,最近几年NFC(near field communication 近场通信)正在开始慢慢普及.由于工作的需要,现在正在学习NFC相关的知识,先将NFC的一些基础罗列一下,做个记录. 1.NFC简介 NFC(近场通讯)能在短距离内与兼容的设备进行识别和数据交换,一般频率在13.56MHZ,它是RFID与互联互通技术整合而来,如果RFID是父的话,NFC则是子,其继承了父请的功能,又在其上有自己的发挥. NFC一般在这三大领域应用:获取简单信息.点到点通信.电子票务.

.NET MVC4 实训记录之五(访问自定义资源文件)

.Net平台下工作好几年了,资源文件么,大多数使用的是.resx文件.它是个好东西,很容易上手,工作效率高,性能稳定.使用.resx文件,会在编译期动态生成已文件名命名的静态类,因此它的访问速度当然是最快的.但是它也有个最大的缺点,就是修改资源文件后,项目必须重新编译,否则修改的资源不能被识别.这对于维护期的工作来讲,非常麻烦.尤其是已经上线的项目,即使是修改一个title的显示,也需要停掉项目.由于本人做了好几年的维护,应该是从工作到现在,一直没有间断过的做维护项目,因此深受其害!必须找到一个