项目开发的脚本层用的是Lua,引擎用的是C++。但是经理不给开放引擎层的代码。刚好最近项目空闲,安排了学习C++跟Lua的通信。

一、C++与Lua数据交互

数据交互主要是通过C API来实现

首先,要加入Lua的头文件

extern "C" {

#include "lua.h"

#include "lualib.h"

#include "lauxlib"

}

也可以用#include "lua.hpp"代替

要使用的lua文件为:test.lua,其中有个变量a = 1

1.创建一个Lua虚拟机;

lua_State *L;

L=lua_open();

链接lua库

luaL_openlibs(L);

早期版本可能得一个个加载。

2.导入lua文件

luaL_dofile(L,"test.lua");

3.获取想要的lua变量:a

lua_getglobal(L,"a");

int b = (int)lua_tonumber(L,-1);

cout<<b<<endl;

这样就获取了test.lua中的变量a.

C++与Lua的之间函数的相互调用

1.C++调Lua函数

C与lua的所有交互都是通过一个栈来完成的。我对前面提到的虚拟机L的理解是,它就是一个栈(可能理解的不对)。然后通过对这个栈的操作来实现数据的交互。

调用函数跟访问变量其实差不多,前面都是做一样的事,只是调用函数时获取的变量是函数名。然后将需要的参数逐一入栈,最好通过lua_call来调用函数。具体实现如下。

********test.lua*************

function add(x,y)

return x+y

end

******************************

int main(int argc,char *argv[])

{

int ret;

int x = 1;

int y = 2;

lua_State *L = lua_open();

luaL_openlibs(L);

luaL_dofile(L);

lua_getglobal(L,"add");    //将函数入栈

lua_pushnumber(L,x);  //变量x入栈

lua_pushnumber(L,y);   //变量y入栈

lua_call(L,2,1)      //2表示参数个数,1表示函数返回值的个数。因为lua可以返回多个值。 我的理解是将x,y出栈,计算函数值,并将函数值入栈。这时,函数值就在栈顶。

ret = lua_tonumber(L,-1)    //获取栈顶元素,并出栈。-1表示对栈顶的偏移量为1。负数时对栈顶的偏移量,正数是对栈底的偏移量。如果返回的是字符串就用lua_tostring。

lua_pop(L,1);   //将函数出栈

lua_close(L);

return 0;

}

2.Lua调C++函数

lua要调用C的函数需要将C函数注册到lua中。

int add(lua_State *L)

{

double sum = 0;

sum = lua_tonumber(L,-1) + lua_tonumber(L,-2);    //取栈顶两元素,并相加

lua_pushnumber(L,sum);            //将结果返回给lua

return 0;

}

int main(int argc,char *argv[])

{

lua_State *L = lua_open();

luaL_openlibs(L);

lua_register(L,"_add",add);               //向lua注册C函数,第二个参数是lua中的函数名,第三个参数是C的函数名。

luaL_dofile(L,"luaandc.lua");             //执行lua文件

return 0;

}

最新文章

  1. IOS 代码提示有问题
  2. 电商平台如何接入快递鸟电子面单API?
  3. DataContractJsonSerializer类
  4. 安装配置MongoDB数据库
  5. web.xml文件中的7个错误的安全配置
  6. W10上面DOSBOX安装
  7. Java实现字符串转换十六进制MD5值
  8. 【解高次同余方程】51nod1038 X^A Mod P
  9. Certbot为域名申请免费SSL证书
  10. vue2+webpack 移动生态 常用依赖
  11. c++进阶学习
  12. Oracle12c 的安装教程图解(安装系统:windows 2008R2)
  13. Linux基础命令---文本编辑tee
  14. window.open 子窗口关闭刷新父页面
  15. &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=7&quot; /&gt;
  16. DIN-A4 doublesided year calendar
  17. mongo转换副本集
  18. android NDK 开发环境搭建
  19. Redis自学笔记–Zset类型及管理简述
  20. linux 命令 uniq

热门文章

  1. Java基础知识强化71:正则表达式之基本规则 和 常用正则表达式
  2. 排序算法源码(JAVA)
  3. git 取消追踪
  4. VS2013配置文件常见问题解决方法
  5. HDU -2546饭卡(01背包+贪心)
  6. Java多线程——线程的生命周期和状态控制
  7. 关于 keybd_event (vb篇)
  8. jquery插件--多行文本缩略
  9. VS2015编译器问题简单记录
  10. MVC验证码的编写