自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解關(guān)于在Lua中調(diào)用C++函數(shù)

移動開發(fā) iOS
在本文中我們將用C++創(chuàng)建一個函數(shù),告訴Lua解釋器它的情況,最后從Lua中調(diào)用它并使用其結(jié)果。本文在后面也將談一談Lua程序中的錯誤檢查

關(guān)于在Lua中調(diào)用C++函數(shù)是本文要介紹的內(nèi)容,主要是來了解在Lua中調(diào)用C++函數(shù)。由于我沒有想到一個簡單的例子來說明這種情況,因此,我借用了Lua官方文檔中的average函數(shù)來進行講解。

本教程涵蓋了Lua5.1。在Lua的每一個版本中都有一些非常不同之處。下面的示例代碼將不能在老版本的Lua下運行。如果你仍然在使用老版本而且不愿意升級,不用擔心,我已經(jīng)在文章底部提供了4.0和5.0教程的源代碼下載連接。好了,讓我們開始吧!

在本文中我們將用C++創(chuàng)建一個函數(shù),告訴Lua解釋器它的情況,***從Lua中調(diào)用它并使用其結(jié)果。本文在后面也將談一談Lua程序中的錯誤檢查。

定義函數(shù)

***步是定義函數(shù)。所有在Lua中被調(diào)用的C/C++函數(shù)將使用下面一類指針進行調(diào)用:

typedef int (*lua_CFunction) (lua_State *L);換句話說,函數(shù)必須要以Lua解釋器作為唯一的參數(shù),并且返回一個唯一的整數(shù)。由于用一個Lua解釋器作為參數(shù),因此函數(shù)實際上能夠從棧中取得任意數(shù)量的參數(shù)。在后面我們將看到,返回的整數(shù)實際上是被壓入棧的值的個數(shù)。通過如此容易的封裝,就能滿足你在Lua中調(diào)用C++函數(shù)的需求。

下面給出的C++函數(shù)average()演示了如何接受多個參數(shù)且返回超過一個值。記住,該函數(shù)是一個與上面typedef相匹配的函數(shù)。

lua_gettop函數(shù)返回棧頂?shù)乃饕?。因為在Lua中棧是從1開始編號的,因此該函數(shù)獲得的值就是參數(shù)的個數(shù)。

在for循環(huán)中計算所有參數(shù)之和。

調(diào)用lua_pushnumber()將參數(shù)的平均值壓棧。

將參數(shù)之和壓入棧中。

***,函數(shù)返回2,說明有兩個返回值在棧中。

現(xiàn)在C++函數(shù)已經(jīng)被定義好了,我們必須將它告訴Lua解釋器。這將在main函數(shù)中初始化Lua解釋器和載入庫完成之后完成:

  1. /* 注冊函數(shù) */  
  2. lua_register(L, "average", average); 

保存文件為luaavg.cpp。如果你直接使用C而不是C++,將文件名改為luaavg.c,然后將extern "C"刪除。

  1. #include <stdio.h> 
  2.  
  3. extern "C" {  
  4. #include "lua.h"  
  5. #include "lualib.h"  
  6. #include "lauxlib.h"  
  7. }  
  8.  
  9. /* 指向Lua解釋器的指針 */  
  10. lua_State* L;  
  11.  
  12. static int average(lua_State *L)  
  13. {  
  14. /* 得到參數(shù)個數(shù) */  
  15. int n = lua_gettop(L);  
  16. double sum = 0;  
  17. int i;  
  18.  
  19. /* 循環(huán)求參數(shù)之和 */  
  20. for (i = 1; i <= n; i++)  
  21. {  
  22. /* 求和 */  
  23. sum += lua_tonumber(L, i);  
  24. }  
  25.  
  26. /* 壓入平均值 */  
  27. lua_pushnumber(L, sum / n);  
  28.  
  29. /* 壓入和 */  
  30. lua_pushnumber(L, sum);  
  31.  
  32. /* 返回返回值的個數(shù) */  
  33. return 2;  
  34. }  
  35.  
  36. int main ( int argc, char *argv[] )  
  37. {  
  38. /* 初始化Lua */  
  39. L = lua_open();  
  40.  
  41. /* 載入Lua基本庫 */  
  42. luaL_openlibs(L);  
  43.  
  44. /* 注冊函數(shù) */  
  45. lua_register(L, "average", average);  
  46.  
  47. /* 運行腳本 */  
  48. luaL_dofile(L, "avg.lua");  
  49.  
  50. /* 清除Lua */  
  51. lua_close(L);  
  52.  
  53. /* 暫停 */  
  54. printf( "Press enter to exit…" );  
  55. getchar();  
  56.  
  57. return 0;  

下面是以5個參數(shù)調(diào)用average函數(shù)并且顯示兩個返回值的Lua腳本,我們將其保存為avg.lua:

  1. -- call a C++ function  
  2. avg, sum = average(10, 20, 30, 40, 50)  
  3. print("The average is ", avg)  
  4. print("The sum is ", sum) 

編譯

在Linux下,在命令行鍵入:

g++ luaavg.cpp -llua -llualib -o luaavg然后,鍵入下列命令運行:

./luaavg如果沒有問題, 程序?qū)@示出平均值、和。

在Visual C++你將需要進行下列步驟:

創(chuàng)建一個新的空Win32控制臺應用工程。

將"luatest.cpp"加入你的工程。

選擇項目菜單中的屬性菜單。

在"連接器"的"輸入"欄目的"附加依賴項"中輸入"lua5.1.lib"。

確定。

此時,按F7構(gòu)建程序。

如果你采用的是dll庫,請確保將其放在應用程序的目錄中或者windows系統(tǒng)能夠找到它的地方。如果你采用的是靜態(tài)連接庫,則不需要。

錯誤處理

如果你已經(jīng)閱讀了Lua的API文檔,你將看出實際上我上面的average函數(shù)沒有進行錯誤檢查。這樣做是為了更容易地講解,然而在真實的程序中你應該做一些錯誤檢測。在上面的例子中,我們至少應該檢查每個參數(shù)是不是數(shù)字。通過在for循環(huán)中添加下面的代碼來實現(xiàn):

  1. if (!lua_isnumber(L, i)) {  
  2. lua_pushstring(L, "Incorrect argument to 'average'");  
  3. lua_error(L);  

添加這樣的檢查很容易,同時這樣也讓調(diào)試更容易。當處理用兩種不同語言編寫的程序的時候,這顯得相當重要。

小結(jié):詳解關(guān)于在Lua中調(diào)用C++函數(shù)的內(nèi)容介紹完了,希望通過本文的學習能對你 有所幫助!

責任編輯:zhaolei 來源: lewutian
相關(guān)推薦

2011-08-22 17:25:31

LuaC++函數(shù)

2011-08-25 16:47:53

LuaC++ 證書

2010-01-28 13:35:41

調(diào)用C++函數(shù)

2013-12-13 16:53:00

Lua腳本語言C++

2024-04-01 09:13:20

C++函數(shù)遞增

2011-08-23 18:00:00

lua 腳本測試C

2010-01-21 11:23:58

C++函數(shù)調(diào)用

2010-02-02 15:59:32

C++賦值函數(shù)

2023-11-09 23:56:21

2023-10-30 11:45:44

FridaC++函數(shù)

2010-01-20 14:25:56

函數(shù)調(diào)用

2023-11-09 23:31:02

C++函數(shù)調(diào)用

2013-12-13 17:33:22

Lua對象管理

2011-08-29 16:48:50

Lua配置文件C++

2024-01-25 11:36:08

C++構(gòu)造函數(shù)關(guān)鍵字

2011-08-29 09:54:45

LUAJAVA 方法

2010-01-27 17:16:52

C++構(gòu)造函數(shù)

2010-01-26 10:42:26

C++函數(shù)

2011-08-23 15:02:59

LuaTable

2011-08-23 16:22:45

Lua 4.0函數(shù)
點贊
收藏

51CTO技術(shù)棧公眾號