lua 基础教程(lua基础教程视频)这样也行?

随心笔谈1年前 (2023)发布 admin
141 0



最近在看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();

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,”https://www.jb51.net/article/script/hw.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()

int luaadd(lua_State *L, int x, int y)
{
int sum;

lua_getglobal(L,”add”);

lua_pushnumber(L,x);

lua_pushnumber(L,y);

lua_call(L,2,1);

sum=(int)lua_tointeger(L,-1);

//n
lua_pop(L,1);
return sum;
}
int main()
{
int sum;

lua_State *L=luaL_newstate();

luaL_openlibs(L);

luaL_dofile(L,”https://www.jb51.net/article/script/test.lua”);

sum=luaadd(L,10,15);

cout<<“The sum=”<<sum<<endl;

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_State *L=luaL_newstate();

luaL_openlibs(L);

lua_register(L,”average”,average);

luaL_dofile(L,”https://www.jb51.net/article/script/avg.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基础教程之表(Table)学习笔记Lua基础教程之赋值语句、表达式、流程控制、函数学习笔记在Lua中使用模块的基础教程

© 版权声明

相关文章