Content

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

文章摘要

这篇文章介绍了如何在C/C++项目中使用Lua的C API进行跨语言集成,涵盖以下几个关键点: 1. **背景** 文章指出Lua是一个轻量级的脚本语言,广泛用于快速原型开发和技术证明。然而,由于Lua本身的跨语言支持能力有限,文章介绍了如何在C/C++中使用Lua的C API(C API)来调用Lua脚本。 2. **主要内容** - 使用Lua的C API在Windows下搭建环境,并提供了相关资源链接供用户参考。 - 通过代码示例展示了如何在C/C++中调用Lua脚本,包括创建Lua虚拟机、加载Lua库函数、调用Lua函数以及处理Lua堆栈问题。 3. **代码示例** - **调用Lua脚本**(hw.lua):通过C/C++代码直接执行Lua脚本,并演示了如何使用`luaL_newstate`、`lua_openlibs`、`lua_dofile`等函数。 - **调用Lua函数**(test.lua):展示了如何在C/C++函数中调用Lua内置函数,并使用`lua_call`宏处理调用过程。 - **调用C/C++函数**(avg.lua):通过Lua函数调用C/C++代码,实现了计算平均值和总和的功能。 4. **应用示例** 文章通过具体的代码示例展示了如何将Lua脚本与C/C++代码无缝集成,解决了跨语言项目中函数调用和数据传递的问题。这些示例涵盖了从简单脚本到复杂函数调用的完整流程。 总结来说,文章详细介绍了如何在C/C++中使用Lua的C API进行跨语言集成,提供了实用的代码示例,并指出了当前遇到的堆栈问题,鼓励用户进一步探索和实践。



最近在看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中使用模块的基础教程