c++调用lua的基本操作

目标: 用c++读取下面lua文件的变量,表,调用函数:

由于还有些表要我配,今天任务延期,没完成,明日再更新

name = "织法"
age = 25
color = {r=1.0,g=0.2,b=0.5,a=1.0}
arr = {1,2,3,4,5}
function Add(a,b)
    return a+b
end
function Squar(num)
    return num * num
end
function Dist2D(pointA,pointB)
    local xdst = pointA.x - pointB.x
    local ydst = pointA.y - pointB.y
    return math.sqrt(Squar(xdst) + Squar(ydst))
end
print("hello lua")

c++ luabase.h

#pragma once
#include<string>
#include<cstring>
#include<cstdlib>
#include<cstdio>
using namespace std;
#include "lua.hpp"

extern lua_State *L;

struct luaColor
{
    double r, g, b, a;
    void output();
};

bool lua_checkf(int err);
#define LUA_CHECK(f) do{if(!lua_checkf(f))        return false;}while(0)
void loadLua();
void cloaseLua();
int loadInteger(const char* v_key);
const char* loadString(const char* v_key);
int lua_add(int a, int b);
bool loadColor(luaColor *v_color);

c++ luabase.cpp

#include"luabase.h"

lua_State *L;

bool lua_checkf(int err)
{
    if (!err)
    {
        printf("报错啦,错误信息是%s\n", lua_tostring(L, -1));
        return false;
    }
    return true;
}

#define LUA_CHECK(f) do{if(!lua_checkf(f))        return false;}while(0)

void loadLua()
{
    const string filename = "lua/test.lua";
    L = luaL_newstate();
    luaopen_base(L);
    luaL_openlibs(L);
    luaL_dofile(L, filename.data());
}

void cloaseLua()
{
    lua_close(L);
}

int loadInteger(const char* v_key)
{
    LUA_CHECK(lua_getglobal(L, v_key));
    int rst = lua_tointeger(L, -1);
    lua_pop(L, 1);
    return rst;
}

const char* loadString(const char* v_key)
{
    LUA_CHECK(lua_getglobal(L, v_key));
    lua_pop(L, 1);
    return lua_tostring(L, -1);
}

int lua_add(int a,int b)
{
    lua_getglobal(L, "Add");
    lua_pushinteger(L, a);
    lua_pushinteger(L, b);
    if (lua_pcall(L, 2, 1, 0) != LUA_OK)
    {
        printf("报错啦,错误信息是%s\n",lua_tostring(L, -1));
    }
    int rst = lua_tointeger(L, -1);
    lua_pop(L, 3);
    return rst;
}

static double getDoubleField()
{

}

bool loadColor(luaColor *v_color)
{
    LUA_CHECK(lua_getglobal(L, "color"));
    LUA_CHECK(lua_getfield(L, -1, "r"));
    v_color->r = lua_tonumber(L, -1);
    lua_pop(L, 1);
    LUA_CHECK(lua_getfield(L, -1, "g"));
    v_color->g = lua_tonumber(L, -1);
    lua_pop(L, 1);
    LUA_CHECK(lua_getfield(L, -1, "b"));
    v_color->b = lua_tonumber(L, -1);
    lua_pop(L, 1);
    LUA_CHECK(lua_getfield(L, -1, "a"));
    v_color->a = lua_tonumber(L, -1);
    lua_pop(L, 1);
    lua_pop(L, 1);
    return true;
}

void luaColor::output()
{
    printf("color:{%d,%d,%d,%d}", (int)(r*255), (int)(g*255), (int)(b*255), (int)(a*255));
}
时间: 2024-10-23 00:16:59

c++调用lua的基本操作的相关文章

简述C/C++调用lua中实现的自定义函数

1.首先说下目的,为什么要这么做 ? 正式项目中,希望主程序尽量不做修改,于是使用C/C++完成功能的主干(即不需要经常变动的部分)用lua这类轻量级的解释性语言实现一些存在不确定性的功能逻辑:所以,程序功能如有问题,只需对lua脚本作出修改,而修改脚本的好处是简单高效,改完脚本后重新执行程序便能看到效果.  2.具体怎么做? 一般来说,C/C++调用lua接口或是数据交互,首先要做的是包含lua相关操作的头文件以及lua库相关的头文件,然后调用接口创建lua环境.用操作栈的规则和lua交互数据

C++调用Lua的性能测试

游戏服务器经典的架构就是C++和Lua的结合,C++开发主体框架,Lua实现一些复杂的逻辑.我们都知道Lua是一种非常快的语言,但是到底有多块,我们测试下看看. C++调用Lua的性能测试,发现不对的地方望提出. 实验一:我们使用C++调用Lua带8个以上参数的函数,而这个函数里面什么也没有做.我们通过这个实验能够简单地测试出:使用Lua虚拟机和向调用栈当中传入8+个参数和Lua取出这些参数的时间.但是其中的参数类型比较多样,有整形,浮点型,和数组.实验的Lua函数比较简单,如下: functi

C调用Lua

C调用Lua的流程 1.创建一个Lua运行环境 2.将lua程序编译并载入虚拟栈 3.运行编译好的程序块 4.读取运行结果到虚拟栈中 5.对虚拟栈进行交互 1 /*读取lua配置文件样例*/ 2 3 char fname[]="config"; 4 float width,height; 5 //创建lua运行环境 6 lua_State *L = luaL_newstate(); 7 luaL_openlibs(L); 8 9 //载入程序块并执行 10 if (luaL_loadf

vs项目中使用c++调用lua

在前一篇文章中,我们已经讲了如何编译lua源码并生成lua.lib(请阅读 使用vs2010编译lua5.1源码生成lua.lib),在新的项目中,我们继续使用之前的项目来学习如何使用c++调用lua. 一.创建项目 同样在该解决方案中,右键解决方案->添加项目->命名为testlua,选择win32控制台程序->不需要其他配置,选择完成. 二.配置项目 右键testlua项目->通用属性->框架和引用->添加新引用,指向lua项目. 右键testlua项目->配

C调用lua的table里面的函数

网上搜索C.C++调用lua函数,有一大堆复制粘贴的. 但是搜索<C调用lua的table里面的函数> 怎么就没几个呢? 经过探索,发现其实逻辑是这样的: 1.根据name获取table :并判断是否为table 2.根据 name2 获取table的成员变量或方法,并判断栈顶的是否为函数 3.将函数的参数压栈,然,没有可以传入一个nil: 4.调用lua_pcall 跟调用普通lua函数的方法就一样了. 代码如下: bool call_table_func(const char * tabl

lua入门之二:c/c++ 调用lua及多个函数返回值的获取

当 Lua 调用 C 函数的时候,使用和 C 调用 Lua 同样类型的栈来交互. C 函数从栈中获取她的參数.调用结束后将返回结果放到栈中.为了区分返回结果和栈中的其它的值,每一个 C 函数还会返回结果的个数(the  function  returns  (in  C)  the  number  of  results  it  is leaving on the stack.). // luacallcpp.cpp : 定义控制台应用程序的入口点. // #include "stdafx.

C中调用Lua函数

我们先来看一个简单的例子: lua_State* L = NULL; // 内部调用lua函数 double f(double x, double y) { double z; lua_getglobal(L, "f"); // 获取lua函数f lua_pushnumber(L, x); // 压入参数x和y lua_pushnumber(L, y); if(lua_pcall(L, 2, 1, 0) != 0) error(L, "error running functi

lua入门之一:c/c++ 调用lua

lua和c / c++的数据交互通过栈进行, 操作数据时,首先将数据拷贝到"栈"上,然后获取数据,栈中的每个数据通过索引值进行定位,索引值为正时表示相对于栈底的偏移索引,索引值为负时表示相对于栈顶的偏移索引,索引值以1或 - 1为起始值,因此栈顶索引值永远为 - 1, 栈底索引值永远为1 . "栈"相当于数据在lua和c / c++之间的中转地.每种数据都有相应的存取接口 . --region *.lua --Date --此文件由[BabeLua]插件自动生成 p

C++调用Lua

转载请注明出处:http://blog.csdn.net/zhy_cheng/article/details/39756423 我使用的cocos2d-x版本是2.3.3,先在一个C++工程中配置好lua的环境. 首先导入lua项目 1.liblua工程是cocos2d-x-2.2.3\scripting\lua\proj.win32\liblua.vcxproj这个文件,导入VS2010工程中 2.包含目录:在工程的属性-配置属性-C/C++-常规-附加包含目录中加入$(ProjectDir)