C++中调用Lua配置文件和响应函数示例

Lua是脚本语言,最大的优势就是轻巧灵便,不用编译。当C的框架写好,只要更改lua的相应处理即可以更改功能,并且不用重新编译。以下是在C中调用Lua资源方法的示例程序:
 
C++端:

// Lua1.cpp : 定义控制台应用程序的入口点。
// 

#include "stdafx.h"
#include<stdio.h> 

extern "C" { //如不用extern会出现连接错误,编译成了C++文件
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
} 

void load (lua_State *L,int *width,int *height){
  lua_getglobal(L,"width");  //获得Lua中变量的值,将其放入栈中
  lua_getglobal(L,"height"); 

  if(!lua_isnumber(L,-2))   //栈顶为-1,然后依次减少
    luaL_error(L,"`width' should be a number\n"); 

  if(!lua_isnumber(L,-1))
    luaL_error(L,"`height' should be a number\n");
  *width = (int)lua_tonumber(L,-2);  //将栈顶元素转化为数字
  *height = (int)lua_tonumber(L,-1);
} 

int add(lua_State *L,int a, int b){
  int sum=0;
  lua_getglobal(L,"add");  //函数也是变量,所以一个取法
  lua_pushnumber(L,a);   //将变量传入
  lua_pushnumber(L,b);
    //第二个参数为调用函数的参数的个数,第三个为返回值的个数,第四个参数是错误处理函数,正常运行返回0
  if(lua_pcall(L,2,1,0) != 0){
    luaL_error(L,"the lua load error! %s",lua_tostring(L,-1));
  }
     //函数的返回值已经传入栈中
  if(!lua_isnumber(L,-1)){
    luaL_error(L,"the func run error! %s",lua_tostring(L,-1));
  } 

  sum = (int)lua_tonumber(L,-1); //取栈顶元素将其转为数字,默认为double型
   lua_pop(L,1)    //将return元素移除
  return sum;
} 

int get_num(lua_State *L){ 

  lua_getglobal(L,"roll_num");
  if(lua_pcall(L,0,1,0) != 0){
    luaL_error(L,"the lua load error! %s",lua_tostring(L,-1));
  } 

  if(!lua_isnumber(L,-1)){
    luaL_error(L,"the func run error! %s",lua_tostring(L,-1));
  }
   int n = (int)lua_tonumber(L,-1);
  lua_pop(L,1);
  return n;
}
int _tmain(int argc, _TCHAR* argv[])
{
  lua_State *L = lua_open();
  luaL_openlibs(L); //新版本库添加的方法
  if(luaL_loadfile(L,"cof.lua") || lua_pcall(L,0,0,0)){
    luaL_error(L,"loadfile error! %s \n",lua_tostring(L,-1));
  } 

  int w=1,h=2;
  int sum;
  load(L,&w,&h);
  printf("width is %d ,height is %d\n",w,h);
  sum=add(L,w,h);
  printf("the sum is: %d \n",sum); 

  bool flag = true;
  char c;
  while(flag){
    printf("Do you want to roll the number? \n");
    scanf("%c",&c);
    if(c == 'y' || c=='Y'){
      printf("rolling the number....\n the num is %d \n",get_num(L));
    }
    else flag=false;
    getchar();
  } 

  getchar();
  return 0;
} 

Lua 文件:

-- config test 

width = 200
height = 500 

function add(a,b)
  return a+b
end 

math.randomseed(os.time())
function roll_num()
  return math.random(6)
end 
(0)

相关推荐

  • C++中调用Lua配置文件和响应函数示例

    Lua是脚本语言,最大的优势就是轻巧灵便,不用编译.当C的框架写好,只要更改lua的相应处理即可以更改功能,并且不用重新编译.以下是在C中调用Lua资源方法的示例程序:   C++端: // Lua1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<stdio.h> extern "C" { //如不用extern会出现连接错误,编译成了C++文件 #include <lua.h> #

  • C++中调用Lua函数实例

    唉,今天心情有点糟糕,我就少说一些啰嗦的话了. (旁白:太好了-) 上一章传送门:http://www.jb51.net/article/55096.htm 经过前面几章的介绍,相信大家对Lua的堆栈已经比较熟悉了,如果还不是很熟悉的朋友,建议多看几遍前面的教程,或者多敲几次代码. 那么,如果已经对Lua的堆栈比较熟悉,接下来的内容就很简单了. 今天我们来看看C++如何调用Lua的函数,先看看现在Lua文件是什么样的: 复制代码 代码如下: -- helloLua.lua文件 myName =

  • C语言代码中调用C++代码的方法示例

    由于历史原因,以及不同开发人员的技术偏好,C语言和C++语言都有一些独有的非常有价值的项目,因而两种语言的互操作,充分利用前人造的轮子是一件非常有价值的事情. C++代码调用C代码很简单,只要分别在包含的C头文件的开头和结尾加上如下的两个块: #ifdef __cplusplus extern "C" { #endif 和 #ifdef __cplusplus } #endif 即可. 然而为了支持类.重载等更加高级的特性,在编译C++代码时,C++符号会被修饰.我们dump Linu

  • Lua教程(三):C语言、C++中调用Lua的Table示例

    从写上一篇Lua的文章到现在,已经过去半月有余了,是时候让自己的Lua状态refresh一下了.本教程将介绍Lua的栈及基本栈操作,同时还有如何在C/C++代码里面读取Lua的Table. 理解Lua栈 Lua通过一个"虚拟栈"与C/C++程序进行数据交互,所有的Lua C API都是通过操作这个栈来完成相应的数据通信. Lua的这个"虚拟栈"解决了C/C++程序与Lua程序通信的两大问题: 1.Lua使用垃圾回收,而C/C++需要手动管理内存. 2.Lua使用动态

  • C语言中调用Lua函数实例

    记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪.那个时期,人们经常称互联网为赛博空间.如今工作了,大量的零碎时间用于上微博,知乎,QQ,这些碎片化的阅读让人读起来轻松,也能获取些粗浅的信息.然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎会告诉你回答了多少问题,阅读了相当于一部<红楼梦>那么多的文字.只是当你静下来一想,这些浅阅读并没给你带来有深度,系统的知识.在你的时间线上,两条相邻信息往往是八竿子也打不着的.而且你还时不时去

  • Cocos2d-x中调用Lua及HelloWorld.lua源码分解

    Lua脚本,以前我不知道它有多强大,但是当我做了1年的手机网游之后,起码我发现了,更新客户端是一件很恐怖的事情(会导致大量玩家的流失,以及有一个漫长并且惊心动魄的审核过程),太扯了.于是,如果可以只更新脚本,那就不需要玩家重新下载客户端了,直接在线更新,嗯嗯,虽然我发现了这个,但是还没有实现.噗,代码写烂了,不好改.   所以啊,我已经做好准备了,如果下次用cocos2d-x开发,lua不可少啊~!   看看官方的例子吧,先来AppDelegate.cpp的applicationDidFinis

  • Lua中调用C++函数示例

    Lua当然也能够调用C中定义的函数.一个平均数的例子,解释一下.    下面给出的C++函数average()演示了如何接受多个参数且返回超过一个值. 1.lua_gettop函数返回栈顶的索引值.因为在Lua中栈是从1开始编号的,因此该函数获得的值就是参数的个数. 2.在for循环中计算所有参数之和. 3.调用lua_pushnumber()将参数的平均值压栈.  4.最后,函数返回1,说明有一个返回值在栈中. 现在C++函数已经被定义好了,我们必须将它告诉Lua解释器.这将在main函数中初

  • Java代码中与Lua相互调用实现详解

    目录 一.方案 二.性能测试 1. ScriptEngine调用方式 2. Globals调用方式 3. lua调用java 三.结论 四.其他调用方式? 一.方案 Java与Lua相互调用案例比较少,因此项目使用需要做详细的性能测试,本内容只做粗略测试. 目前已完成初版Lua-Java调用框架开发,后期有时间准备把框架进行抽象,并开源出来,感兴趣的小伙伴欢迎关注下. 目前最常见的方案:luaj,纯Java实现的Lua解析器,基于Lua 5.2 LuaJ的原理:用Java实现了一套Lua的编译器

  • Lua中调用C语言函数实例

    在上一篇文章(C调用lua函数)中,讲述了如何用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的.正如Java与c语言之间使用JNI来互调,Lua与C也可以互调. 当lua调用c函数时,使用了和c调用lua中的同一种栈,c函数从栈中得到函数,然后将结果压入栈中.为了区分返回结果和栈中的其他值,每一个函数返回结果的个数. 这里有个重要的概念:这个栈不是全局的结构,每个函数都有自己的私有局部栈.哪怕c函数调用了lua代码,lua代码再次调用该c函数,他们有各自独立的局部栈.第一个参数

  • Lua中调用C++函数实例

    到这为止,大家对Lua和C++之间的通信应该有些熟悉了,今天我们来介绍最后一个操作. (旁白:什么?最后一个?要结束了么?太好了~!) 上一章传送门:http://www.jb51.net/article/55097.htm 1. Lua调用C++的函数 Lua要调用C++的函数还是蛮方便的,首先,我们来创建一个c++函数先: 复制代码 代码如下: public: static int getNumber(int num); int HelloLua::getNumber( int num )

随机推荐