最近在看lua,觉得很有趣,发现没有最新版本的例子,所以自己就别人的博客里弄了源码,然后改成最新版本的lua C API.
关于lua非常基础的就不介绍了,咱们就从简单的测试开始吧。
在此之前如果没有搭好lua在win32下的环境,请看 https://www.jb51.net/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 个元素*/ //n lua_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); end main();
lua,基础教程
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]