lua 实现接口(lua模块)

网友投稿 790 2023-01-07


本篇文章给大家谈谈lua 实现接口,以及lua模块对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享lua 实现接口的知识,其中也会对lua模块进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

如何正确在lua中调用C++的接口

当我们需要在Lua里面调用c/c++函数时,所有的函数都必须满足以下函数签名:
复制代码 代码如下:
typedef int (*lua_CFunction) (lua_State *L);
换句话说,所有的函数必须接收一个lua_State作为参数,同时返回一个整数值。因为这个函数使用Lua栈作为参数,所以它可以从栈里面读取任意数量和任意类型的参数。而这个函数的返回值则表示函数返回时有多少返回值被压入Lua栈。(因为Lua的函数是可以返回多个值的)
示例一
定义C++函数指针
复制代码 代码如下:
int average(lua_State *L)
{
// get number of arguments
int n = lua_gettop(L);
double sum = 0;
int i;
// loop through each argument
for (i = 1; i <= n; i++)
{
// total the arguments
sum += lua_tonumber(L, i);
}
// push the average
lua_pushnumber(L, sum / n);
// push the sum
lua_pushnumber(L, sum);
// return the number of results
return 2;
}
注册此函数给Lua
复制代码 代码如下:
lua_register(L, "average", average);
Lua里面调用此函数
复制代码 代码如下:
avg, sum = average(10, 20, 30, 40, 50)
print("The average is ", avg)
print("The sum is ", sum)
示例二
定义C++函数
复制代码 代码如下:
int displayLuaFunction(lua_State *l)
{
// number of input arguments
int argc = lua_gettop(l);
// print input arguments
std::cout << "[C++] Function called from Lua with " << argc
<< " input arguments" << std::endl;
for(int i=0; i<argc; i++)
{
std::cout << " input argument #" << argc-i << ": "
<< lua_tostring(l, lua_gettop(l)) << std::endl;
lua_pop(l, 1);
}
// push to the stack the multiple return values
std::cout << "[C++] Returning some values" << std::endl;
lua_pushnumber(l, 12);
lua_pushstring(l, "See you space cowboy");
// number of return values
return 2;
}
注册此Lua函数
复制代码 代码如下:
// push the C++ function to be called from Lua
std::cout << "[C++] Pushing the C++ function" << std::endl;
lua_pushcfunction(L, displayLuaFunction);
lua_setglobal(L, "displayLuaFunction");
注意,上一个示例,我们使用的是函数是
复制代码 代码如下:
lua_register(L, "average", average);
它其实只是一个宏定义,其实现也是上面两个函数组成的。
在Lua里调用此函数
复制代码 代码如下:
io.write('[Lua] Calling the C functionn')
a,b = displayLuaFunction(12, 3.141592, 'hola')
-- print the return values
io.write('[Lua] The C function returned <' .. a .. ' and <' .. b .. '\n')
实现一个Lua模块
首先,我们把这两个C函数封装到一个数组里面:
复制代码 代码如下:
static const luaL_Reg mylibs[]=
{
{"average", average},
{"displayLuaFunction", displayLuaFunction},
{NULL, NULL}
};
接下来,我们定义另一个C函数,让它注册我们的Lua模块:
复制代码 代码如下:
int lua_openmylib(lua_State *L)
{
luaL_newlib(L, mylibs);
return 1;
};
这里的luaL_newlib会生成一个table,并把所有的mylibs里面的函数填充进去。最后,lua_openmylib返回值为1,表示会把刚刚生成的table压入栈。
最后,我们像之前注册Lua的标准库一样,注册我们新的库,并给它起名字为mylib:
复制代码 代码如下:
static const luaL_Reg lualibs[] =
{
{"base", luaopen_base},
{"io", luaopen_io},
{"mylib", lua_openmylib},
{NULL, NULL}
};
此时,我们在Lua里面调用之前的两个函数就需要带上模块名字前缀了:
复制代码 代码如下:
avg, sum = mylib.average(10, 20, 30, 40, 50)
a,b = mylib.displayLuaFunction(12, 3.141592, 'hola')
结语
注意:这里C函数参数里的Lua栈是私有的,每一个函数都有自己的栈。当一个c/c++函数把返回值压入Lua栈以后,该栈会自动被清空。

lua如何对外输出数据,相关函数有哪些?

1.使用接口方式lua 实现接口,用户代入用户名和密码进入取数据
这是一个携带有有关函数或活动记录的各种信息的结构。 lu a_getstack 只会填充结构的私有部分供后面使用。 调用 lu a_getinfo 可以在 lu a_Debug 中填充那些可被使用的信息域。
下面对 lu a_Debug 的各个域做一个说明lua 实现接口
2.source: 创建这个函数的代码块的名字。 如果 source 以 '@' 打头, 指这个函数定义在一个文件中,而 '@' 之后的部分就是文件名。 若 source 以 '=' 打头, 剩余的部分由用户行为来决定如何表示源码。 其它的情况下,这个函数定义在一个字符串中, 而 source 正是那个字符串。
short_src: 一个“可打印版本”的 source ,用于出错信息。
linedefined: 函数定义开始处的行号。
lastlinedefined: 函数定义结束处的行号。
3.what: 如果函数是一个 Lu a 函数,则为一个字符串 "L ua" ; 如果是一个 C 函数,则为 "C"; 如果它是一个代码块的主体部分,则为 "main"。
currentline: 给定函数正在执行的那一行。 当提供不了行号信息的时候, currentline 被设为 -1 。
name: 给定函数的一个合理的名字。 因为 L ua 中的函数是一等公民, 所以它们没有固定的名字lua 实现接口: 一些函数可能是全局复合变量的值, 另一些可能仅仅只是被保存在一张表的某个域中。 lua _getinfo 函数会检查函数是怎样被调用的, 以此来找到一个适合的名字。 如果它找不到名字, name 就被设置为 NULL 。
4.namewhat: 用于解释 name 域。 namewhat 的值可以是 "global", "local", "method", "field", "upvalue", 或是 "" (空串)。 这取决于函数怎样被调用。 (Lu a 用空串表示其它选项都不符合。)
istailcall: 如果函数以尾调用形式调用,这个值就为真。 在这种情况下,当层的调用者不在栈中。
nups: 函数的上值个数。
nparams: 函数固定形参个数 (对于 C 函数永远是 0 )。
isvararg: 如果函数是一个可变参数函数则为真 (对于 C 函数永远为真)。
5.没有内置的调试机制。 但是它提供了一组特殊的函数接口以及 钩子。 这组接口可用于构建出不同的调试器、性能剖析器、 或是其它需要从解释器获取“内部信息”的工具。
6.通常,这个函数不会返回; 当协程一次次延续,将从延续函数继续运行。 然而,有一个例外: 当这个函数从一个逐行运行的钩子函数(参见) 中调用时,l ua_yieldk 不可以提供延续函数。 (也就是类似 lu a_yield 的形式), 而此时,钩子函数在调用完让出后将立刻返回。 L ua 会使协程让出,一旦协程再次被延续, 触发钩子的函数会继续正常运行。
7.当一个线程处于未提供延续函数的 C 调用中,调用它会抛出一个错误。 从并非用延续方式(例如:主线程)启动的线程中调用它也会这样。

如何在Lua与C/C++之间实现table数据的交换

你说的应该是用c语言往lua里传递一组table数据吧
LUA的 C库有提供相关的接口 实现这个操作
不过接口并不是直接使用的 你需要对lua与c交互有足够的理解 自己去构造一个方法
相关的实现 你可以搜一下 应该有很多现成的代码
不过不推荐使用这种方法去操作数据 因为table表的结构多变 你很难构造一个通用的方法去完成多种table表的数据传递 那会导致这样一种情况 基本上每个table表的传递 你都要重新构造一个c的方法 这种工作量算下来不划算
更合理的方式是 对于table表里对应的c中的数据 你给出lua中可以访问的接口 在lua中构造这个table表 这样操作更灵活
至于把luatable数据传递给c 需要说明的是 c中并不存在table这种数据结构 如果你要这么做
你需要在c端自己构造一个方法去解析table 这里也不推荐这么做 理由同上 更好的方法是把table表中的元素拆解出来 需要传递的元素在c端做一个接口

unity怎么在lua中用protobuf的?

unity在lua中用protobuf可以在PC或者移动设备上使用。

lua-protobuf的高层接口:

pb.dll提供四个模块:

1、pb模块:高层接口,提供和pbc兼容的encode/decode接口。

2、pb.conv:这是一个转换工具库,负责在Lua里方便地在protobuf提供的各种类型和Lua原生类型之间转换。

3、pb.slice:提供了底层的protobuf协议解析能力,能够在不知道message的情况下解析协议二进制数据。

4、pb.buffer:提供了底层的protobuf的协议序列化能力,能够在不知道message的情况下序列化信息。

5、http://pb.io:这个主要是为写protoc插件使用的。protoc会把pb二进制文件通过stdin传递给插件,然而stdin在Windows下默认是用文本模式打开的,这就会导致解析错误。因此http://pb.io提供了二进制模式下的IO读写功能。

lua-protobuf高层接口还提供了这些函数:

1、pb.clear(),清除之前注册的所有消息。

2、pb.clear(msgName),清除某个之前注册的消息

3、pb.load(chunk),直接解析字符串/Slice格式的二进制pb数据注册消息。

lua-protobuf底层接口:

底层接口和C接口主要的功能是在没有/不知道pb数据的情况下,解析二进制的protobuf数据。通常情况下是用不上的,如果有需求的话后续会在这里更新使用说明。

关于lua 实现接口和lua模块的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 lua 实现接口的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于lua模块、lua 实现接口的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java IO流之字符缓冲流实例详解
下一篇:稳定的接口自动化框架(主流自动化框架)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~