首页 > 编程知识 正文

向lua中注册php函数,lua调用php

时间:2023-12-27 22:26:24 阅读:324218 作者:JGIK

本文目录一览:

调用一个动态库中的函数,这个函数有一个参数是结构体指针,我如何使用这个指针?

你就也定义一个形参中的结构体指针接收传过来的结构体指针就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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。