好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > Lua調用自定義C模塊

Lua調用自定義C模塊

熱門標簽:外呼系統一天耗費多少流量 杞縣地圖標注app 陜西便宜電銷機器人軟件 衡水外呼線路解決 海口智能語音電銷機器人好用嗎 電話機器人每天搜索多少次 昆明電話外呼系統好么 免費門店地圖標注注冊入駐 艾比利外呼系統

這是《Lua程序設計》中提到的,但是想成功執行,對于初學Lua的確沒那么簡單。這里涉及如何如何生成一個動態鏈接庫so文件;Lua5.2中導出函數從LuaL_register變成了LuaL_newlib。對于具體的細節有待深入。這里的模塊名是hello_lib, Lua解釋器會根據名字找到對應的模塊,而后執行其中的 luaopen_XXX方法。 代碼:

#include math.h>
#include lua5.2/lua.h>
#include lua5.2/lauxlib.h>
#include lua5.2/lualib.h>
static int hello_sin(lua_State *L){
double d = luaL_checknumber(L, 1);
lua_pushnumber(L, sin(d));
return 1;
}
static const struct luaL_Reg hello_lib[] = {
{"hello_sin" , hello_sin},
{NULL, NULL}
};
int luaopen_hello_lib(lua_State *L){
luaL_newlib(L, hello_lib);
//luaL_register(L, "hello_lib",hello_lib); // lua 5.1
return 1;
}

在Lua中調用:

local hello = require "hello_lib"
print(hello.hello_sin(1))

執行過程和結果: 

1. C函數作為應用程序的一部分。

#include stdio.h>
#include string.h>
#include lua.hpp>
#include lauxlib.h>
#include lualib.h>

//待Lua調用的C注冊函數。
static int add2(lua_State* L)
{
  //檢查棧中的參數是否合法,1表示Lua調用時的第一個參數(從左到右),依此類推。
  //如果Lua代碼在調用時傳遞的參數不為number,該函數將報錯并終止程序的執行。
  double op1 = luaL_checknumber(L,1);
  double op2 = luaL_checknumber(L,2);
  //將函數的結果壓入棧中。如果有多個返回值,可以在這里多次壓入棧中。
  lua_pushnumber(L,op1 + op2);
  //返回值用于提示該C函數的返回值數量,即壓入棧中的返回值數量。
  return 1;
}

//另一個待Lua調用的C注冊函數。
static int sub2(lua_State* L)
{
  double op1 = luaL_checknumber(L,1);
  double op2 = luaL_checknumber(L,2);
  lua_pushnumber(L,op1 - op2);
  return 1;
}

const char* testfunc = "print(add2(1.0,2.0)) print(sub2(20.1,19))";

int main()
{
  lua_State* L = luaL_newstate();
  luaL_openlibs(L);
  //將指定的函數注冊為Lua的全局函數變量,其中第一個字符串參數為Lua代碼
  //在調用C函數時使用的全局函數名,第二個參數為實際C函數的指針。
  lua_register(L, "add2", add2);
  lua_register(L, "sub2", sub2);
  //在注冊完所有的C函數之后,即可在Lua的代碼塊中使用這些已經注冊的C函數了。
  if (luaL_dostring(L,testfunc))
    printf("Failed to invoke.\n");
  lua_close(L);
  return 0;
}

2. C函數庫成為Lua的模塊。

    將包含C函數的代碼生成庫文件,如Linux的so,或Windows的DLL,同時拷貝到Lua代碼所在的當前目錄,或者是LUA_CPATH環境變量所指向的目錄,以便于Lua解析器可以正確定位到他們。在我當前的Windows系統中,我將其copy到"C:\Program Files\Lua\5.1\clibs\",這里包含了所有Lua可調用的C庫。見如下C語言代碼和關鍵性注釋:

 #include stdio.h>
 #include string.h>
 #include lua.hpp>
 #include lauxlib.h>
 #include lualib.h>
 
 //待注冊的C函數,該函數的聲明形式在上面的例子中已經給出。
 //需要說明的是,該函數必須以C的形式被導出,因此extern "C"是必須的。
 //函數代碼和上例相同,這里不再贅述。
 extern "C" int add(lua_State* L) 
 {
   double op1 = luaL_checknumber(L,1);
   double op2 = luaL_checknumber(L,2);
   lua_pushnumber(L,op1 + op2);
   return 1;
 }
 
 extern "C" int sub(lua_State* L)
 {
   double op1 = luaL_checknumber(L,1);
   double op2 = luaL_checknumber(L,2);
   lua_pushnumber(L,op1 - op2);
   return 1;
 }
 
 //luaL_Reg結構體的第一個字段為字符串,在注冊時用于通知Lua該函數的名字。
 //第一個字段為C函數指針。
 //結構體數組中的最后一個元素的兩個字段均為NULL,用于提示Lua注冊函數已經到達數組的末尾。
 static luaL_Reg mylibs[] = { 
   {"add", add},
   {"sub", sub},
   {NULL, NULL} 
 }; 
 
 //該C庫的唯一入口函數。其函數簽名等同于上面的注冊函數。見如下幾點說明:
 //1. 我們可以將該函數簡單的理解為模塊的工廠函數。
 //2. 其函數名必須為luaopen_xxx,其中xxx表示library名稱。Lua代碼require "xxx"需要與之對應。
 //3. 在luaL_register的調用中,其第一個字符串參數為模塊名"xxx",第二個參數為待注冊函數的數組。
 //4. 需要強調的是,所有需要用到"xxx"的代碼,不論C還是Lua,都必須保持一致,這是Lua的約定,
 //  否則將無法調用。
 extern "C" __declspec(dllexport)
 int luaopen_mytestlib(lua_State* L) 
 {
   const char* libName = "mytestlib";
   luaL_register(L,libName,mylibs);
   return 1;
 }

    見如下Lua代碼:

require "mytestlib"  --指定包名稱

--在調用時,必須是package.function

print(mytestlib.add(1.0,2.0))
print(mytestlib.sub(20.1,19))

您可能感興趣的文章:
  • C語言與Lua之間的相互調用詳解
  • C++利用LuaIntf調用Lua的方法示例
  • 簡單談談lua和c的交互
  • Lua編程示例(六): C語言調用Lua函數
  • Lua編程示例(五): C語言對Lua表的讀取和添加
  • Lua編程示例(一):select、debug、可變參數、table操作、error
  • Lua中調用C++函數示例
  • C++中調用Lua配置文件和響應函數示例
  • 使用Lua來擴展C++程序的方法
  • Lua和C/C++互相調用實例分析

標簽:臨滄 西寧 宿遷 昌都 營口 海口 泰安 南京

巨人網絡通訊聲明:本文標題《Lua調用自定義C模塊》,本文關鍵詞  Lua,調用,自定義,模塊,Lua,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Lua調用自定義C模塊》相關的同類信息!
  • 本頁收集關于Lua調用自定義C模塊的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 2021年韩国三级乱理电影| 风间由美理伦片在线观看| 抱紧大腿(校园末世)消灭糖果小说| 樱花动漫 官方入门网站| 天堂影院在线观看高清在线| 亚洲电影欧美电影国产| 3d黄漫在线观看| 给个网站最新的2021| 啪在线视频| 动漫18?动漫免费网站免费观看 | 久久精品国产亚洲麻豆| 狠狠综合久久综合88亚洲日本| 啊哈~给我~啊(H)男男| 亚洲国产精品一区二区久| 空乘美女被下药糟蹋视频| 成人一级网站| 日本三级小说| Japanese HD.XXXX| 強姦?乱暴を強いられる黑人| 全肉一女n男np乱禁| 欧美亚洲性色影视在线| 三浦惠理子中文字幕在线一区二区| 精品欧美一区视频在线观看| 英语课代表说不能再深了| 欧美AV无码一区二区70老年人| 韩国穿丝袜三级bd高清| 男男高H文| 午夜爽爽性刺激一区二区视频| 吃乡村女人鼓鼓的奶水| 久久久香蕉| 又粗又湿又紧又爽A无码| 天天躁夜夜躁狠狠躁躁88| 凹凸日日摸日日碰夜夜爽孕妇| 亚洲AV天堂精品一区天堂霜花店| 韩国电影2828| 野外露营高H辣文| 色黄小视频| 男生的鸡鸡插入女生的屁股 | 麻豆免费播放| 欧美激情在线观看一区二区三区 | 美女一级毛片毛片在线播放|