lua 基础教程
技术 / 管理员 发布于 6年前 318
最近在看lua,觉得很有趣,发现没有最新版本的例子,所以自己就别人的博客里弄了源码,然后改成最新版本的lua C API.
关于lua非常基础的就不介绍了,咱们就从简单的测试开始吧。
在此之前如果没有搭好lua在win32下的环境,请看 ///article/61451.htm
1.C/C++执行lua脚本
我只是用改用了最新的lua的C API。不多说,直接上代码
#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};using namespace std;int main(){lua_State *pLuaState = luaL_newstate();/*载入lua基本库*/luaL_openlibs(pLuaState);//luaopen_base(pLuaState);//luaopen_io(pLuaState); //替换老版本的lua_iolibopen(pLuaState);//luaopen_string(pLuaState); //替换老版本的lua_strlibopen(pLuaState);//luaopen_math(pLuaState); //替换老版本的lua_mathlibopen(pLuaState);//luaopen_debug(pLuaState); //替换老版本的lua_dblibopen(pLuaState);/*运行脚本*/luaL_dofile(pLuaState,"./script/hw.lua");/*清除lua*/ lua_close(pLuaState);/*暂停*/cout<<"Press enter to exit…"<<endl;getchar();return 0;}
hw.lua的源码:
print("Hello Word!");
这个例子只是简单的执行了一个lua脚本。
其中:lua_newstate是核心函数,要求提供内存分配函数,luaL_newstate是辅助库函数,采用默认的内存分配函数。lua_open是5.0时代的产物,5.1是luaL_newstate的宏,5.2里面已经没有了。
2.C/C++调用lua函数
话不多说,直接上代码
#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};using namespace std;/************************************************************************///函数功能:调用lua函数//函数参数:// L lua虚拟机// x// y//函数返回:// sum//核心函数 lua_call()/*调用一个函数。要调用一个函数请遵循以下协议: 首先,要调用的函数应该被压入堆栈; 接着,把需要传递给这个函数的参数按正序压栈;这是指第一个参数首先压栈。 最后调用一下 lua_call; nargs 是你压入堆栈的参数个数。 当函数调用完毕后,所有的参数以及函数本身都会出栈。而函数的返回值这时则被压入堆栈。 返回值的个数将被调整为 nresults 个, 除非 nresults 被设置成 LUA_MULTRET。在这种情况下,所有的返回值都被压入堆栈中。 Lua 会保证返回值都放入栈空间中。函数返回值将按正序压栈(第一个返回值首先压栈), 因此在调用结束后,最后一个返回值将被放在栈顶。被调用函数内发生的错误将(通过 longjmp)一直上抛。*//************************************************************************/int luaadd(lua_State *L, int x, int y){int sum;/*通过名字获取Lua函数*/lua_getglobal(L,"add");/*向栈中压入第一个参数*/lua_pushnumber(L,x);/*向栈中压入第二个参数*/lua_pushnumber(L,y);/*调用函数*/lua_call(L,2,1);/*得到结果把给定索引处的 Lua 值转换为 lua_Integer 这样一个有符号整数类型。这个 Lua 值必须是一个数字或是一个可以转换为数字的字符串,否则,lua_tointeger 返回 0 。*/sum = (int)lua_tointeger(L,-1);/*从堆栈中弹出 n 个元素*///nlua_pop(L,1);return sum;}int main(){int sum;/*初始化lua虚拟机*/lua_State *L = luaL_newstate();/*载入lua基本库*/luaL_openlibs(L);/*载入脚本*/luaL_dofile(L,"./script/test.lua");/*调用lua函数*/sum = luaadd(L,10,15);/*显示结果*/cout<<"The sum = "<<sum<<endl;/*清除lua虚拟机*/lua_close(L);/*显示结果并暂停*/cout<<"Press enter to exit…"<<endl;getchar();return 0;}
test.lua代码为:
function add(x,y)return x + y;end
其中关于lua的堆栈问题,目前我还没有了解,希望大家多多指教。
3.lua调用C/C++函数
代码为:
#include <iostream>#include <stdlib.h>#include <stdio.h>#include <string.h>extern "C"{#include "lua.h"#include "lualib.h"#include "lauxlib.h"};using namespace std;static int average(lua_State *L){/*得到参数个数*/int n = lua_gettop(L);/*定义和*/double sum = 0;/*循环变量*/int i;/*循环取值求和*/for (i = 1; i <= n; i++){sum += lua_tonumber(L,i);//cout<<sum<<endl;}//cout<<"fffffff"<<endl;/*压入平均值*/lua_pushnumber(L,sum/n);/*压入和*/lua_pushnumber(L,sum);/*返回返回值个数*/return 2;}int main(){/*初始化Lua虚拟机*/lua_State *L = luaL_newstate();/*打开lua基本库*/luaL_openlibs(L);/*注册函数*/lua_register(L,"average",average);/*运行脚本*/luaL_dofile(L,"./script/avg.lua");/*清除lua虚拟机*/lua_close(L);/*打印暂停*/cout<<"Press enter to exit…"<<endl;getchar();return 0;}
avg.lua源码为:
function main()local avg,sum = average(2,2,2,2,2);print("The avg is",avg);print("The sum is", sum);endmain();
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号