zoukankan      html  css  js  c++  java
  • C++与lua交互

    项目开发的脚本层用的是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;

    }

  • 相关阅读:
    CSS3 3D Transform
    js关闭当前页面(窗口)的几种方式总结
    JavaScript书籍阅读
    使用@media screen解决移动web开发的多分辨率问题
    ie678 兼容问题
    JS动态引入js,CSS——动态创建script/link/style标签
    扁平化设计的流行配色方案
    最简单的jquery轮播图
    ie7 z-index 失效问题
    js正则表达式手机号(邮箱)验证
  • 原文地址:https://www.cnblogs.com/zhenzi/p/3467903.html
Copyright © 2011-2022 走看看