本文目录一览:
- 1、调用一个动态库中的函数,这个函数有一个参数是结构体指针,我如何使用这个指针?
- 2、lua如何对外输出数据,相关函数有哪些?
- 3、Lua5.3 module 函数怎么使用
- 4、求问大神,luaL_Reg怎么用啊
- 5、怎么把如下php代码写成lua代码?
- 6、LUA 读取C#中返回值为数组的函数
调用一个动态库中的函数,这个函数有一个参数是结构体指针,我如何使用这个指针?
你就也定义一个形参中的结构体指针接收传过来的结构体指针就OK啦
形参中的结构体指针改变?这什么意思?
给你看个例子吧:
struct node *creat(struct node *l)
{
struct node *head;
head=l;
return head;
}
你是这样吗~
lua如何对外输出数据,相关函数有哪些?
1.使用接口方式,用户代入用户名和密码进入取数据
这是一个携带有有关函数或活动记录的各种信息的结构。 lu a_getstack 只会填充结构的私有部分供后面使用。 调用 lu a_getinfo 可以在 lu a_Debug 中填充那些可被使用的信息域。
下面对 lu a_Debug 的各个域做一个说明:
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 _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 调用中,调用它会抛出一个错误。 从并非用延续方式(例如:主线程)启动的线程中调用它也会这样。
Lua5.3 module 函数怎么使用
1.编写一个简单的模块
Lua的模块是什么东西呢?通常我们可以理解为是一个table,这个table里有一些变量、一些函数…
等等,这不就是我们所熟悉的类吗?
没错,和类很像(实际上我说不出它们的区别)。
我们来看看一个简单的模块,新建一个文件,命名为game.lua,代码如下:
复制代码代码如下:
game = {}
function game.play()
print("那么,开始吧");
end
function game.quit()
print("你走吧,我保证你不会出事的,呵,呵呵");
end
return game;
我们定义了一个table,并且给这个table加了两个字段,只不过这两个字段的值是函数而已。
至于如何使用模块,那就要用到我们之前介绍过的require了。
我们在main函数里这么使用:
复制代码代码如下:
local function main()
cc.FileUtils:getInstance():addSearchPath("src")
game = require("game");
game.play();
end
注意,我们要require其他文件的时候,要把文件路径给设置好,否则会找不到文件。
因为我使用的是Cocos Code IDE,直接调用addSearchPath函数就可以了,我的game.lua文件是在src目录下的。
好了,运行代码,结果如下:
复制代码代码如下:
[LUA-print] 那么,开始吧
OK,这就是一个很简单的模块,如果我们习惯了Java、C++等面向对象语言,那也可以简单地把模块理解为类。
求问大神,luaL_Reg怎么用啊
扩展Lua的基本方法之一就是为应用程序注册新的C函数到Lua中去。
当我们提到Lua可以调用C函数,不是指Lua可以调用任何类型的C函数(有一些包可以让Lua调用任意的C函数,但缺乏便捷和健壮性)。正如我们前面所看到的,当C调用Lua函数的时候,必须遵循一些简单的协议来传递参数和获取返回结果。相似的,从Lua中调用C函数,也必须遵循一些协议来传递参数和获得返回结果。另外,从Lua调用C函数我们必须注册函数,也就是说,我们必须把C函数的地址以一个适当的方式传递给Lua解释器。
当Lua调用C函数的时候,使用和C调用Lua相同类型的栈来交互。C函数从栈中获取她的参数,调用结束后将返回结果放到栈中。为了区分返回结果和栈中的其他的值,每个C函数还会返回结果的个数(the function returns (in C) the number of results it is leaving on the stack.)。这儿有一个重要的概念:用来交互的栈不是全局变量,每一个函数都有他自己的私有栈。当Lua调用C函数的时候,第一个参数总是在这个私有栈的index=1的位置。甚至当一个C函数调用Lua代码(Lua代码调用同一个C函数或者其他的C函数),每一个C函数都有自己的独立的私有栈,并且第一个参数在index=1的位置。
26.1 C 函数
先看一个简单的例子,如何实现一个简单的函数返回给定数值的sin值(更专业的实现应该检查他的参数是否为一个数字):
static int l_sin (lua_State *L) {
double d = lua_tonumber(L, 1);/* get argument */
lua_pushnumber(L, sin(d));/* push result */
return 1;/* number of results */
}
任何在Lua中注册的函数必须有同样的原型,这个原型声明定义就是lua.h中的lua_CFunction:
typedef int (*lua_CFunction) (lua_State *L);
从C的角度来看,一个C函数接受单一的参数Lua state,返回一个表示返回值个数的数字。所以,函数在将返回值入栈之前不需要清理栈,函数返回之后,Lua自动的清除栈中返回结果下面的所有内容。
我们要想在Lua使用这个函数,还必须首先注册这个函数。我们使用lua_pushcfunction来完成这个任务:他获取指向C函数的指针,并在Lua中创建一个function类型的值来表示这个函数。一个quick-and-dirty的解决方案是将这段代码直接放到lua.c文件中,并在调用lua_open后面适当的位置加上下面两行:
lua_pushcfunction(l, l_sin);
lua_setglobal(l,"mysin");
第一行将类型为function的值入栈,第二行将function赋值给全局变量mysin。这样修改之后,重新编译Lua,你就可以在你的Lua程序中使用新的mysin函数了。在下面一节,我们将讨论以比较好的方法将新的C函数添加到Lua中去。
对于稍微专业点的sin函数,我们必须检查sin的参数的类型。有一个辅助库中的luaL_checknumber函数可以检查给定的参数是否为数字:当有错误发生的时候,将抛出一个错误信息;否则返回作为参数的那个数字。
怎么把如下php代码写成lua代码?
base64需要自己找个库调用一下,其他部分实现了,下面是代码
local function decode(str, skey)
str = str or ""
skey = skey or "cxphp"
local replaceStr = string.gsub(str, "O0O0O", "=")
replaceStr = string.gsub(replaceStr, "o000o", "+")
replaceStr = string.gsub(replaceStr, "oo00o", "/")
local strArr = {}
local replaceStrLen = string.len(replaceStr)
for pos = 1, replaceStrLen, 2 do
local posEnd = math.min(pos + 1, replaceStrLen)
strArr [#strArr + 1] = string.sub(replaceStr, pos, posEnd)
end
local strCount = #strArr
for key = 1, string.len(skey) do
local value = string.sub(skey, key, key)
print(key, value, strArr[key], string.sub(strArr[key], 2, 2))
if key = strCount and strArr[key] and string.sub(strArr[key], 2, 2) == value then
strArr[key] = string.sub(strArr[key], 1, 1)
end
end
local needToDecode = table.concat(strArr)
print(needToDecode)
-- TODO: find a lib base64_decode
end
LUA 读取C#中返回值为数组的函数
返回数组给lua并不是这样吧,应该是返回一个 table
我记得应该是
lua_newtable
然后往这个table里插入。
还有你确定你这个C#的函数注册了吗。我记得注册到lua里的函数定义应该不是这样的
函数应该是返回一个 int 值,表示该函数返回多少个返回值。
//定义一个C函数
//如这个函数,返回 1 一个返回值,值为 9
int Test(lua_State* l)
{
lua_pushinteger(l, 9);
return 1;
}
//将这个函数注册到 lua 内
lua_register(L, "Test", Test);
这样 lua 内就可以使用
local k = Test()
结果 k = 9