最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言模塊回調Lua函數的兩種方法

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

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

1. C保存函數對象

C模塊可以通過注冊表保存Lua里面的對象,等適當時候取出再調用即可。

復制代碼 代碼如下:

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把棧頂的值取出,放到指定的tabel中,然后返回一個索引(目測是數組的index)。 lua_rawgeti把之前保存的function對象取出,再由lua_call調用。
復制代碼 代碼如下:

function callback(  )
    print "Callback"
end

cb.setnotify(callback)
cb.testnotify()


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

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

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

3. 完整例子
cb.c

復制代碼 代碼如下:

#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
復制代碼 代碼如下:

require("cb")

function callback(  )
  print "Callback"
end

function defcallback()
  print "Predef callback"
end

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

相關文章

  • lua中使用毫秒精度時間的方法

    lua中使用毫秒精度時間的方法

    這篇文章主要介紹了lua中使用毫秒精度時間的方法,本文講解使用luasocket庫實現毫秒精度時間,需要的朋友可以參考下
    2015-04-04
  • lua?判斷字符串是否包含指定字符的方法

    lua?判斷字符串是否包含指定字符的方法

    在Lua中,如果你想判斷一個字符串是否包含特定的子字符串(例如?a),你可以使用?string.find?函數,這篇文章主要介紹了lua?判斷字符串是否包含指定字符,需要的朋友可以參考下
    2024-03-03
  • lua閉包的理解以及表與函數的幾種表達方法

    lua閉包的理解以及表與函數的幾種表達方法

    本文首先通過具體的例子講解了Lua中閉包的概念,然后總結了閉包的應用場合,最后探討了Lua中閉包的實現原理,以及l(fā)ua中表與函數的3種表達方式的匯總
    2015-08-08
  • 淺談Lua的面向對象特性

    淺談Lua的面向對象特性

    這篇文章主要介紹了Lua的面向對象特性,包括對象和繼承等傳統(tǒng)OOP概念的幾個關鍵知識點,需要的朋友可以參考下
    2015-05-05
  • Lua常用時間函數使用實例

    Lua常用時間函數使用實例

    這篇文章主要介紹了Lua常用時間函數使用實例,本文直接給出使用代碼實例,并附有詳細注釋,要用到哪個復制即可,需要的朋友可以參考下
    2015-04-04
  • Lua模塊與包學習筆記

    Lua模塊與包學習筆記

    這篇文章主要介紹了Lua模塊與包學習筆記,本文講解了加載模塊、加載機制等內容,需要的朋友可以參考下
    2014-12-12
  • lua腳本語言快速入門教程

    lua腳本語言快速入門教程

    這篇文章主要介紹了lua腳本語言快速入門教程,本文講解了變量及常量、字符串、邏輯控制語句、循環(huán)結構、函數及其使用等內容,需要的朋友可以參考下
    2015-03-03
  • Lua腳本語言簡明入門教程

    Lua腳本語言簡明入門教程

    這篇文章主要介紹了Lua腳本語言簡明入門教程,本文簡潔干練,可以讓一個有編程基礎的快速的學會Lua腳本語言,需要的朋友可以參考下
    2014-09-09
  • Lua判斷變量是否為數字、字符串是否可以轉換為數字等

    Lua判斷變量是否為數字、字符串是否可以轉換為數字等

    這篇文章主要介紹了Lua判斷變量是否為數字、字符串是否可以轉換為數字等,本文講解了Lua 判斷是字符還是數字的方法、Lua判斷數字的方法、判斷可否轉換為數字的方法、判斷并且準備一個初值的方法,需要的朋友可以參考下
    2015-04-04
  • Lua中釋放table占用內存的方法

    Lua中釋放table占用內存的方法

    這篇文章主要介紹了Lua中釋放table占用內存的方法,本文講解了兩種釋放內存的方法,需要的朋友可以參考下
    2015-04-04

最新評論

和田县| 雷山县| 塘沽区| 界首市| 东莞市| 柞水县| 永春县| 乐东| 惠州市| 荣成市| 漳浦县| 澜沧| 樟树市| 广安市| 柳林县| 郯城县| 渝中区| 奉化市| 资兴市| 迭部县| 浦城县| 济宁市| 武夷山市| 玉溪市| 瑞丽市| 三台县| 黄梅县| 泰州市| 河南省| 长武县| 自贡市| 盈江县| 洞口县| 林口县| 大荔县| 罗江县| 朔州市| 和田县| 集贤县| 略阳县| 商城县|