LUA 读取C#中返回值为数组的函数

LUA 读取C#中返回值为数组的函数,第1张

返回数组给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

函数定义就是根据不同开发语言的开发规范把一定的逻辑代码写到一个代码块里面,不同语言定义有细微差别。

一个函数定义是一个可执行的表达式, 执行结果是一个类型为 function 的值。 当 Lua 预编译一个代码块时, 代码块作为一个函数,整个函数体也就被预编译了。 那么,无论何时 Lua 执行了函数定义, 这个函数本身就进行了 实例化(或者说是 关闭了)。 这个函数的实例(或者说是 闭包)是表达式的最终值。

形参被看作是一些局部变量, 它们将由实参的值来初始化:

parlist ::= namelist [‘,’ ‘’] | ‘’

当一个函数被调用, 如果函数并非一个 可变参数函数, 即在形参列表的末尾注明三个点 (''), 那么实参列表就会被调整到形参列表的长度。 变长参数函数不会调整实参列表; 取而代之的是,它将把所有额外的参数放在一起通过 变长参数表达式传递给函数, 其写法依旧是三个点。 这个表达式的值是一串实参值的列表, 看起来就跟一个可以返回多个结果的函数一样。 如果一个变长参数表达式放在另一个表达式中使用, 或是放在另一串表达式的中间, 那么它的返回值就会被调整为单个值。 若这个表达式放在了一系列表达式的最后一个, 就不会做调整了 (除非这最后一个参数被括号给括了起来)。

一个函数定义是一个可执行的表达式, 执行结果是一个类型为 function 的值。 当 Lua 预编译一个代码块时, 代码块作为一个函数,整个函数体也就被预编译了。 那么,无论何时 Lua 执行了函数定义, 这个函数本身就进行了 实例化(或者说是 关闭了)。 这个函数的实例(或者说是 闭包)是表达式的最终值。

形参被看作是一些局部变量, 它们将由实参的值来初始化:

parlist ::= namelist [‘,’ ‘’] | ‘’

当一个函数被调用, 如果函数并非一个 可变参数函数, 即在形参列表的末尾注明三个点 (''), 那么实参列表就会被调整到形参列表的长度。 变长参数函数不会调整实参列表; 取而代之的是,它将把所有额外的参数放在一起通过 变长参数表达式传递给函数, 其写法依旧是三个点。 这个表达式的值是一串实参值的列表, 看起来就跟一个可以返回多个结果的函数一样。 如果一个变长参数表达式放在另一个表达式中使用, 或是放在另一串表达式的中间, 那么它的返回值就会被调整为单个值。 若这个表达式放在了一系列表达式的最后一个, 就不会做调整了 (除非这最后一个参数被括号给括了起来)。

local function fun(x)

end

函数可以复制给变量

f = fun(x)

f(10)

函数可以返回多值,在return 后返回值,多值用逗号分隔

local function rfun()

return 1,2,"name"

end

a,b,name = rfun()

函数可以传递可变参数,用 标识可变参数,可变参数可以赋值给变量

local function fun( )

local r = { } -- 可变参数构成的数组

local count=0

for i,v in pairs(r) do

count = count + v

end

print(count)

end

fun(1,2,3,4,5)

可变参数的长度可以用select(‘#’, ) 获取。

select(n, ) 返回从第n个开始到结束的所有可变参数。如果n大于可变参数的长度则返回nil

local function fun( )

print(select('#', ))

print(select(2, ))

end

fun(1,2,3,4)

fun(1)

输出:

4

2 3 4

1

Lua 与 delphi 的互动,通常是在 delphi 中加载 Lua 的库,比如 Lua for delphi 等。

假设用 Lua 编写了一个函数(保存在 lua_GetColorlua 文件中):

function nogi_GetColor(nR,nG,nB)  

    if nR <= 25 and nG <= 25 and nB <= 25 then -- 取出25以下黑色  

        return 1;  

    end;  

      

    return 0;  

end

那么调用上面 Lua 函数的代码:

uses LUA, LUALIB; //引入LUA库 

function lua_CheckColor(r,g,b:Integer):Boolean;  

var  

Lua : TLua;  

begin  

  Lua := TLuaCreate;   

  luaopen_debug(LuaInstance); //如果要使用debug库  

  luaopen_math(LuaInstance);// 如果要使用math库 不然就会attempt to index global 'math' (a nil value)  

  luaopen_os(LuaInstance);  

  luaopen_string(LuaInstance);  

  luaopen_table(LuaInstance);  

  LuaDoFile('lua_GetColorlua');  

  lua_getglobal(LuaLuaInstance,'nogi_GetColor');  

  lua_pushnumber(LuaLuaInstance, r); //将脚本中add函数使用的参数压栈  

  lua_pushnumber(LuaLuaInstance, g); //将脚本中add函数使用的参数压栈  

  lua_pushnumber(LuaLuaInstance, b); //将脚本中add函数使用的参数压栈  

  

  lua_pcall(LuaLuaInstance, 3, 1,0) ;  

  

  Result := (lua_toInteger(LuaLuaInstance,-1) = 1);  

  LuaFree;  

end;

以上就是关于LUA 读取C#中返回值为数组的函数全部的内容,包括:LUA 读取C#中返回值为数组的函数、程序开发函数的定义怎么定义呢、Lua_函数_可变参数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10126801.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存