c++和Lua交互

lua vm

Lua VM(虚拟机)是指运行Lua脚本的执行环境。Lua VM负责将Lua脚本编译成中间代码,然后将该中间代码解释执行或者编译成本地代码执行。在虚拟机之外,Lua的脚本代码并不能直接被计算机指令执行。因此,必须有想办法将其翻译为虚拟机能够解释和执行的代码。

Lua VM在实现上使用了栈(stack)这一数据结构来存储Lua程序执行时的状态。所有Lua代码都会在虚拟机上进行模拟执行,而每个Lua函数都会被编译成虚拟机执行的代码,所以在Lua中无论是何种函数,都可以被视为一个可被调用的虚拟机程序。

Lua VM的设计非常灵活,可以通过CAPI(Lua与C语言之间的接口)与C++代码互操作。在C该程序调用Lua脚本时,可以将Lua代码文件编译并加载到在C++程序中初始化的Lua VM实例中,使整个程序在VM中被运行。而在Lua VM中调用C++函数时,C++函数需要通过CAPI函数注册到Lua环境中,然后Lua程序才可以在运行期间调用这些函数。

lua vm状态指针

在Lua中,我们通过一个名为lua_State的数据结构来管理Lua的虚拟机状态。这个结构体实际上就是Lua的虚拟机,它保存了代码控制块、运行时栈、全局环境表格等信息,以及用于执行Lua程序的函数、方法和操作符等。每个虚拟机只能执行一个Lua程序。

在C++中,我们可以使用指向lua_State类型的指针变量来访问和管理Lua的虚拟机状态。当我们需要使用Lua VM时,我们需要通过Lua提供的函数(如lua_open()luaL_newstate())创建一个新的Lua VM实例,这样可以获取到一个指向lua_State类型的指针,后续我们可以通过这个指针来操作虚拟机。

c++和lua数据交互的数据结构

在使用Lua进行交互时,Lua会使用一个LIFO(后入先出)的堆栈作为数据传输的通道。这个堆栈位于Lua的虚拟机中,提供了一种简洁而灵活的接口,使C++程序可以方便地读取和修改Lua中的数据。

当我们在通过C++代码来访问Lua中的变量或函数时,我们需要将这些数据从Lua虚拟机从堆栈中“弹出”,并将其转换为C++中相应的类型。同样地,当我们将C++中的数据传递给Lua时,我们需要将这些数据压入Lua虚拟机堆栈中。

当我们通过C++代码遍历Lua中的一个表格(table)时,我们需要从堆栈中获取该表格,然后使用Lua提供的函数(如lua_rawgeti())依次获取每个元素的值,并将其转换为C++中的相应类型。

因此,在Lua和C++之间传递数据时,使用堆栈来传输数据是非常普遍的做法。堆栈使我们能够快速、简单地传递数据,并简化了Lua编程的过程。

v-rep中的一段代码:

bool getIntsFromTable(luaWrap_lua_State* L, int tablePos, size_t intCount, int* arrayField) {
  for (size_t i = 0; i < intCount; i++) {
    luaWrap_lua_rawgeti(L, tablePos, int(i + 1));
    if (!luaWrap_lua_isnumber(L, -1)) {
      luaWrap_lua_pop(L, 1);  // we pop one element from the stack;
      return (false);         // Not a number!!
    }
    arrayField[i] = luaToInt(L, -1);
    luaWrap_lua_pop(L, 1);  // we pop one element from the stack;
  }
  return (true);
}

函数`luaWrap_lua_rawgeti()`获取表格中特定位置上的值。具体来说,它将表格压入堆栈中,并将表格位置和所需索引作为参数,然后从栈中的表格中取回在特定索引处的值。

以下是`luaWrap_lua_rawgeti()`的详细用法:

void luaWrap_lua_rawgeti(lua_State* L, int tableIndex, int itemIndex);

该函数有三个参数:

- `L`:Lua VM的状态指针

- `tableIndex`:要取回其值的表格的栈位置

- `itemIndex`:要在表格中取回的条目的索引

luaToInt()是一个自定义函数,用于将Lua中的值转换为整数类型。而arrayField则是一个C++中的整型数组,用于存储转换后的整数值。-1表示从Lua栈顶位置开始读取值

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值