欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言模塊回調(diào)Lua函數(shù)的兩種方法

 更新時間:2015年04月21日 09:56:53   投稿:junjie  
這篇文章主要介紹了C語言模塊回調(diào)Lua函數(shù)的兩種方法,本文講解了C保存函數(shù)對象、C訪問Lua全局環(huán)境兩種方法,需要的朋友可以參考下

lua和C通過虛擬棧這種交互方式簡單而又可靠,缺點就是C做棧平衡稍微會多寫一點代碼。 今天分享學(xué)到的C模塊回調(diào)Lua函數(shù)的兩種方法,都是炒冷飯,大俠勿噴。

1. C保存函數(shù)對象

C模塊可以通過注冊表保存Lua里面的對象,等適當(dāng)時候取出再調(diào)用即可。

復(fù)制代碼 代碼如下:

static int lua_callback = LUA_REFNIL;

static int setnotify(lua_State *L)
{
  lua_callback = luaL_ref(L, LUA_REGISTRYINDEX);
  return 0;
}

static int testnotify(lua_State *L)
{
  lua_rawgeti(L, LUA_REGISTRYINDEX, lua_callback);
  lua_call(L, 0, 0);
}


luaL_ref把棧頂?shù)闹等〕?,放到指定的tabel中,然后返回一個索引(目測是數(shù)組的index)。 lua_rawgeti把之前保存的function對象取出,再由lua_call調(diào)用。
復(fù)制代碼 代碼如下:

function callback(  )
    print "Callback"
end

cb.setnotify(callback)
cb.testnotify()


2. C訪問Lua全局環(huán)境
第二種方法更簡便,C直接調(diào)用Lua中的函數(shù),就像Lua調(diào)用C一樣
復(fù)制代碼 代碼如下:

static int testenv(lua_State *L)
{
  lua_getglobal(L, "defcallback");
  lua_call(L, 0, 0);
}

該方法的缺點就是如果C模塊獨立編寫,方法名就不太靈活。 用這種方法一般會在Lua端再封裝一層,以隔離全局環(huán)境。

3. 完整例子
cb.c

復(fù)制代碼 代碼如下:

#include <stdio.h>
#include <stdlib.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

static int lua_callback = LUA_REFNIL;

static int setnotify(lua_State *L)
{
  lua_callback = luaL_ref(L, LUA_REGISTRYINDEX);
  return 0;
}

static int testnotify(lua_State *L)
{
  lua_rawgeti(L, LUA_REGISTRYINDEX, lua_callback);
  lua_call(L, 0, 0);
}

static int testenv(lua_State *L)
{
  lua_getglobal(L, "defcallback");
  lua_call(L, 0, 0);
}

static const luaL_Reg cblib[] = {
  {"setnotify", setnotify},
  {"testnotify", testnotify},
  {"testenv", testenv},
  {NULL, NULL}
};

int luaopen_cb(lua_State *L)
{
  luaL_register(L, "cb", cblib);
  return 1;
}


test.lua
復(fù)制代碼 代碼如下:

require("cb")

function callback(  )
  print "Callback"
end

function defcallback()
  print "Predef callback"
end

cb.setnotify(callback)
cb.testnotify()
print "Done"
cb.testenv()

相關(guān)文章

  • Lua教程之弱引用table

    Lua教程之弱引用table

    這篇文章主要介紹了Lua教程之弱引用table,本文講解了自動內(nèi)存管理的缺陷、弱引用table、三種形式的弱引用等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Lua之字符串格式化例子和常用格式化參數(shù)介紹

    Lua之字符串格式化例子和常用格式化參數(shù)介紹

    這篇文章主要介紹了Lua之字符串格式化例子和常用格式化參數(shù)介紹,本文著重講解了格式化參數(shù)的作用,需要的朋友可以參考下
    2015-04-04
  • Lua中..和#運算符的使用方法

    Lua中..和#運算符的使用方法

    這篇文章主要介紹了Lua中..和#運算符的使用方法,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • Lua中__index和__newindex之間的沉默與合作

    Lua中__index和__newindex之間的沉默與合作

    這篇文章主要介紹了Lua中__index和__newindex之間的沉默與合作,本文著重講解了__index和__newindex之間的聯(lián)系,需要的朋友可以參考下
    2014-09-09
  • Lua中break語句的使用方法詳解

    Lua中break語句的使用方法詳解

    這篇文章主要介紹了Lua中break語句的使用方法詳解,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • Lua中操作字符串的基本方法整理

    Lua中操作字符串的基本方法整理

    這篇文章主要介紹了Lua中操作字符串的基本方法整理,是Lua入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • Lua table中安全移除元素的方法

    Lua table中安全移除元素的方法

    這篇文章主要介紹了Lua table中安全移除元素的方法,本文給出3種實現(xiàn)方法,分別是從后往前刪除和while刪除,需要的朋友可以參考下
    2015-06-06
  • ubuntu 14.04下熟悉lua的語法

    ubuntu 14.04下熟悉lua的語法

    擺在本人目前來說最大的困難就是迅速熟悉Lua語言,后續(xù)的一切工作才有可能,所以必須現(xiàn)在電腦上安裝好Lua開發(fā)環(huán)境,之后program with Lua,我們先來熟悉下lua的語法吧。
    2015-04-04
  • Lua編程示例(一):select、debug、可變參數(shù)、table操作、error

    Lua編程示例(一):select、debug、可變參數(shù)、table操作、error

    這篇文章主要介紹了Lua編程示例(一):select、debug、可變參數(shù)、table操作、error,本文直接給出代碼實例,需要的朋友可以參考下
    2015-07-07
  • Lua腳本調(diào)用外部腳本

    Lua腳本調(diào)用外部腳本

    在游戲腳本開發(fā)中,我們往往會發(fā)現(xiàn)腳本量非常大,而且我們經(jīng)常會在一些核心腳本文件中定義常用的功能函數(shù),但是Lua腳本沒有提供include關(guān)鍵詞,那又是怎樣調(diào)用外部函數(shù)的呢?如何實現(xiàn)腳本的Include功能?
    2014-09-09

最新評論