C调用lua函数需要考虑的问题

需要考虑的问题:

1. 使用 lua_pcall 可以调用 lua 函数,首先把 lua 函数入栈,然后把参数入栈, lua_pcall(luaState, 参数个数, 返回值个数, 0) ;
2. 为了在事件触发时回调 lua 函数,需要把 lua 函数保存起来,使用 luaL_ref(luaState, LUA_REGISTRYINDEX) 将位于栈顶的 lua 函数保存到 LUA_REGISTRYINDEX 表里面, LUA_REGISTRYINDEX 是一个全局表, luaL_ref 将返回 lua 函数在 LUA_REGISTRYINDEX 表中的位置 nRef ;
3. 使用 lua_rawgeti(luaState, LUA_REGISTRYINDEX, nRef) 获取之前保存的 lua 函数,nRef 是 lua 函数在 LUA_REGISTRYINDEX 表中的位置, lua 函数将被放到栈顶,这时就可以使用 lua_pcall 调用 lua 函数了;
4. 使用 luaL_unref(luaState, LUA_REGISTRYINDEX, nRef) 可以从 LUA_REGISTRYINDEX 表中删除之前保存的 lua 函数;

示例:

代码如下:

int LuaTest::Attach(lua_State* luaState)
{
    if(lua_isfunction(luaState, 1) != 1)
    {
        return 0;
    }
    lua_settop(luaState, 1);
    m_nRef = luaL_ref(luaState, LUA_REGISTRYINDEX);   // 保存到 LUA_REGISTRYINDEX 表
    lua_pushinteger(luaState, nRef);
   
    return 1;
}

int LuaTest::Detach(lua_State* luaState)
{
    m_nRef = luaL_checknumber(luaState, 1);
    luaL_unref(luaState, LUA_REGISTRYINDEX, nRef);    // 从 LUA_REGISTRYINDEX 表中删除
    m_nRef = 0;
   
    return 0;
}

// 事件监听函数
void LuaTest::EventListener(lua_State* luaState)
{
    lua_rawgeti(luaState, LUA_REGISTRYINDEX, m_nRef);  // 从 LUA_REGISTRYINDEX 表中获取
    lua_pushstring(luaState, "参数1");
    lua_pushstring(luaState, "参数2");
    lua_pcall(luaState, 2, 1, 0);               // 调用 lua 函数
    int nRet = luaL_checknumber(luaState, -1);  // 返回值
}

(0)

相关推荐

  • Lua实现split函数

    function split(s, delim) if type(delim) ~= "string" or string.len(delim) <= 0 then return end local start = 1 local t = {} while true do local pos = string.find (s, delim, start, true) -- plain find if not pos then break end table.insert (t,

  • Lua中if语句嵌套的使用教程

    在Lua编程内嵌if-else语句,这意味着可以使用一个 if 或 else if 在另一个语句if或else if 语句中. 语法 if语句的嵌套语法如下: 复制代码 代码如下: if( boolean_expression 1) then    --[ Executes when the boolean expression 1 is true --]    if(boolean_expression 2)    then       --[ Executes when the boolea

  • Lua教程(二):基础知识、类型与值介绍

    一.基础知识: 1. 第一个程序和函数:     在目前这个学习阶段,运行Lua程序最好的方式就是通过Lua自带的解释器程序,如:   复制代码 代码如下: /> lua     > print("Hello World")     Hello World 这样我们就可以以交互性的方式输入lua代码,并立即得到执行结果了.对于代码块较少的测试程序来说,这种方式确实是非常方便的,然而对于相对复杂的程序而言,这种方式就不是很合适了.如果是这样,我们可以将Lua代码保存到一个独立

  • C调用lua函数需要考虑的问题

    需要考虑的问题: 1. 使用 lua_pcall 可以调用 lua 函数,首先把 lua 函数入栈,然后把参数入栈, lua_pcall(luaState, 参数个数, 返回值个数, 0) : 2. 为了在事件触发时回调 lua 函数,需要把 lua 函数保存起来,使用 luaL_ref(luaState, LUA_REGISTRYINDEX) 将位于栈顶的 lua 函数保存到 LUA_REGISTRYINDEX 表里面, LUA_REGISTRYINDEX 是一个全局表, luaL_ref 将

  • C语言中调用Lua函数实例

    记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪.那个时期,人们经常称互联网为赛博空间.如今工作了,大量的零碎时间用于上微博,知乎,QQ,这些碎片化的阅读让人读起来轻松,也能获取些粗浅的信息.然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎会告诉你回答了多少问题,阅读了相当于一部<红楼梦>那么多的文字.只是当你静下来一想,这些浅阅读并没给你带来有深度,系统的知识.在你的时间线上,两条相邻信息往往是八竿子也打不着的.而且你还时不时去

  • C++中调用Lua函数实例

    唉,今天心情有点糟糕,我就少说一些啰嗦的话了. (旁白:太好了-) 上一章传送门:http://www.jb51.net/article/55096.htm 经过前面几章的介绍,相信大家对Lua的堆栈已经比较熟悉了,如果还不是很熟悉的朋友,建议多看几遍前面的教程,或者多敲几次代码. 那么,如果已经对Lua的堆栈比较熟悉,接下来的内容就很简单了. 今天我们来看看C++如何调用Lua的函数,先看看现在Lua文件是什么样的: 复制代码 代码如下: -- helloLua.lua文件 myName =

  • Lua编程示例(六): C语言调用Lua函数

    C++端: #include "stdafx.h" lua_State *L; void load_lua(lua_State **L,char *filename){ *L=luaL_newstate(); luaL_openlibs(*L); if(luaL_loadfile(*L,filename) || lua_pcall(*L,0,0,0)){ luaL_error(*L,"load file error! %s",lua_tostring(*L,-1))

  • Lua教程(十九):C调用Lua

    1. 基础: Lua的一项重要用途就是作为一种配置语言.现在从一个简单的示例开始吧.   复制代码 代码如下: --这里是用Lua代码定义的窗口大小的配置信息     width = 200     height = 300 下面是读取配置信息的C/C++代码: 复制代码 代码如下: #include <stdio.h> #include <string.h> #include <lua.hpp> #include <lauxlib.h> #include

  • Lua中调用C++函数示例

    Lua当然也能够调用C中定义的函数.一个平均数的例子,解释一下.    下面给出的C++函数average()演示了如何接受多个参数且返回超过一个值. 1.lua_gettop函数返回栈顶的索引值.因为在Lua中栈是从1开始编号的,因此该函数获得的值就是参数的个数. 2.在for循环中计算所有参数之和. 3.调用lua_pushnumber()将参数的平均值压栈.  4.最后,函数返回1,说明有一个返回值在栈中. 现在C++函数已经被定义好了,我们必须将它告诉Lua解释器.这将在main函数中初

  • Lua教程(二十):Lua调用C函数

    Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性.对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数.对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L).简单说明一下,该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数,实现者可以通过该指针进一步获取Lua代码中实际传入的参数.返回值是整型,表示该C函数

  • Lua中调用C++函数实例

    到这为止,大家对Lua和C++之间的通信应该有些熟悉了,今天我们来介绍最后一个操作. (旁白:什么?最后一个?要结束了么?太好了~!) 上一章传送门:http://www.jb51.net/article/55097.htm 1. Lua调用C++的函数 Lua要调用C++的函数还是蛮方便的,首先,我们来创建一个c++函数先: 复制代码 代码如下: public: static int getNumber(int num); int HelloLua::getNumber( int num )

  • Lua函数用法研究

    在Lua 基本语法快速入门中有涉及到函数的用法,但只是普通的应用,并没有深成次的研究一下,介于函数用的还是比较多的就专门做个专题研究一下~    一.函数.变量的用法 函数的定义用关键字function .然后加函数名和变量.注意后面没有do.最后以end结束. 在函数中的变量默认是全局变量,但通常情况下函数中的变量都是在函数中有效的.所以要在声明的时候加上"local" 标明只在局部有效. 二.返回多个结果值 在Lua中的函数可以返回多个返回值.这与C等语言有很大的不同.因为从根本上

  • C++中调用Lua配置文件和响应函数示例

    Lua是脚本语言,最大的优势就是轻巧灵便,不用编译.当C的框架写好,只要更改lua的相应处理即可以更改功能,并且不用重新编译.以下是在C中调用Lua资源方法的示例程序:   C++端: // Lua1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<stdio.h> extern "C" { //如不用extern会出现连接错误,编译成了C++文件 #include <lua.h> #

随机推荐