lua 与 c/c++ 交互(2)c/c++ 调用 lua

7 篇文章 0 订阅

 c调用lua

介绍一本lua的书 <lua程序设计 第二版>,书的作者就是lua 的作者.可想 书的 含金量.
如果 博友 看不懂 底下的 知识点,请研读 上面的 书.
切记,欲速则不达.

c 调用 lua  有几个方面的 知识点:
1. 获取 和 设置 lua 全局变量
2.调用 lua 函数
3. lua table 操作

1.获取 和 设置 lua 全局变量,通过  lua_getglobal,lua_setglobal 获取lua 全局 变量

2.调用lua 函数:1.获取 全局 函数  2. 传参数: lua_pushxxx  3. lua_pcall 执行 lua函数

3.lua table 操作 :包括 获取 table 里的 值  和 设置 table 里的值
3.1获取:  1.获取 全局table  2.通过lua_getfield获取
3.2 设置 : 1. 传值 2. 设置 lua_setfield

直接 上代码:
1.在工程 源码 下 新建 一个 test.lua 
a = 10
b = 20
print(a+b)


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


luaTable = {
name = "fu",
score = 100
}


2.新建 win32控制台程序 ,在 

#include "stdafx.h"
#include <stdlib.h>
#include <string>
//加入 lua 动态链接库
#pragma comment(lib,"lua51")
extern "C"{
#include "lua\lua.h"
#include "lua\lualib.h"
#include "lua\lauxlib.h"
}
using namespace std;

extern void error(lua_State *,const char *,...);
int _tmain(int argc, _TCHAR* argv[])
{
lua_State * l = luaL_newstate();
luaL_openlibs(l);
if (luaL_loadfile(l,"test.lua") || lua_pcall(l,0,0,0))//执行test.lua
{
error(l,"error : %s",lua_tostring(l,-1));
}
//获取lua 变量 a,b
lua_getglobal(l,"a");
lua_getglobal(l,"b");
int a,b;
if (lua_isnumber(l,-1) && lua_isnumber(l,-2))
{
b = lua_tonumber(l,-1);
a = lua_tonumber(l,-2);
printf("获取变量a,b:%d\t%d\n",a,b);
}
//获取 lua 函数 add
lua_getglobal(l,"add");
lua_pushinteger(l,a);
lua_pushinteger(l,b);
if (lua_pcall(l,2,1,0))
{
error(l,"执行lua add函数 报错:%s",lua_tostring(l,-1));
}
if (lua_isnumber(l,-1))
{
int sum = lua_tonumber(l,-1);
printf("执行lua add函数 sum: %d\n",sum);
lua_pop(l,1);
}


//获取 和 设置 lua table
lua_getglobal(l,"luaTable");
lua_getfield(l,-1,"name");
//获取
if (lua_isstring(l,-1))
{
string s = lua_tostring(l,-1);
lua_pop(l,1);
printf("获取table的值:%s \n",s.c_str());
}
//设置
lua_pushstring(l,"li");
lua_setfield(l,-2,"name");
//验证
lua_getglobal(l,"luaTable");
lua_getfield(l,-1,"name");
if (lua_isstring(l,-1))
{
string s = lua_tostring(l,-1);
lua_pop(l,1);
printf("设置table的值:%s :",s.c_str());
}
lua_close(l);
return 0;
}


//lua 执行错误后,打印错误信息, 关闭 luaState,退出程序
void error(lua_State * l,const char * formart,...){
va_list args;
va_start(args,formart);
vfprintf(stderr,formart,args);
va_end(args);
lua_close(l);
exit(-1);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值