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

解析調(diào)用Lua函數(shù)使用方法

移動(dòng)開(kāi)發(fā) iOS
調(diào)用Lua函數(shù)使用方法是本文要介紹的內(nèi)容,本教程涵蓋了Lua5.1。在Lua的每一個(gè)版本中都有一些非常不同之處,具體內(nèi)容來(lái)看本文詳解。

調(diào)用Lua函數(shù)使用方法是本文要介紹的內(nèi)容,本教程涵蓋了Lua5.1。在Lua的每一個(gè)版本中都有一些非常不同之處。下面的示例代碼將不能在老版本的Lua下運(yùn)行。這篇文章將教你如何在Lua中定義一個(gè)函數(shù),然后在C/C++程序中調(diào)用它。同時(shí),我們將學(xué)習(xí)到參數(shù)傳遞,返回值,以及處理全局變量。

你的***個(gè)Lua函數(shù)

Lua中定義函數(shù)是相當(dāng)簡(jiǎn)單的。Lua函數(shù)以關(guān)鍵字"function"開(kāi)頭,后面跟隨函數(shù)名,然后是參數(shù)列表。函數(shù)定義以關(guān)鍵字"end"結(jié)束。Lua函數(shù)能夠接受多個(gè)參數(shù),而且可以返回多個(gè)參數(shù)。

下面是一個(gè)實(shí)現(xiàn)兩個(gè)數(shù)相加并返回結(jié)果的Lua函數(shù)。我們將它保存為"add.lua"文件。

  1. -- add two numbersfunction add ( x, y )return x + yend  

在Lua入門(mén)中,我們已經(jīng)知道調(diào)用luaL_dofile()就是執(zhí)行腳本。因?yàn)樵诒疚闹形覀冎欢x了一個(gè)函數(shù),故只需簡(jiǎn)單地調(diào)用luaL_dofile()函數(shù)就能執(zhí)行add函數(shù)。

我在前面已經(jīng)說(shuō)過(guò),Lua函數(shù)能夠接受多個(gè)參數(shù),返回多個(gè)結(jié)果。這是用棧來(lái)實(shí)現(xiàn)的。

為了調(diào)用一個(gè)Lua函數(shù),首先需要將函數(shù)壓入棧中。再將參數(shù)壓入。然后,調(diào)用lua_call()去調(diào)用Lua函數(shù)。函數(shù)調(diào)用完成之后,返回值存在于棧中。所有這些步驟將被展示在luaadd()函數(shù)定義中。

調(diào)用lua_getglobal()將add()函數(shù)壓入棧中。

調(diào)用lua_pushnumber()將***個(gè)參數(shù)x壓入棧中。

同樣,調(diào)用lua_pushnumber()將第二個(gè)參數(shù)y壓入棧中。

調(diào)用lua_call(),其參數(shù)的意思是兩個(gè)參數(shù),一個(gè)返回值。

現(xiàn)在,我們可以利用lua_tointeger()獲得整型返回值。

***,調(diào)用lua_pop()將值從棧中移出。

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

  1. #include <stdio.h>  extern "C" {   
  2. #include "lua.h"   
  3. #include "lualib.h"   
  4. #include "lauxlib.h"  
  5. }    
  6. /* 指向Lua解釋器的指針 */  
  7. lua_State* L;   
  8. int luaadd (   
  9. int x, int y   
  10. ){  
  11.  int sum;  
  12.   /* 通過(guò)名字得到Lua函數(shù) */  
  13.  lua_getglobal(L, "add");   
  14.  /* ***個(gè)參數(shù) */  
  15.  lua_pushnumber(L, x);   
  16.  /* 第二個(gè)參數(shù) */  
  17.  lua_pushnumber(L, y);   
  18.  /* 調(diào)用函數(shù),告知有兩個(gè)參數(shù),一個(gè)返回值 */  
  19.  lua_call(L, 2, 1);   
  20.  /* 得到結(jié)果 */  
  21.  sum = (int)lua_tointeger(L, -1);  
  22.  lua_pop(L, 1);   
  23.  return sum;  
  24.  }    
  25.  int main ( int argc, char *argv[] ){   
  26.  int sum;   
  27.  /* 初始化Lua */  
  28.  L = lua_open();   
  29.  /* 載入Lua基本庫(kù) */  
  30.  luaL_openlibs(L);   
  31.  /* 載入腳本 */  
  32.  luaL_dofile(L, "add.lua");   
  33.  /* 調(diào)用Lua函數(shù) */  
  34.  sum = luaadd( 10, 15 );   
  35.  /* 顯示結(jié)果 */  
  36.  printf( "The sum is %d/n", sum );   
  37.  /* 清除Lua */  
  38.  lua_close(L);   
  39.  /* 暫停 */  
  40.  printf( "Press enter to exit…" );  
  41.  getchar();   
  42.  return 0;  
  43.  }  

編譯

在Linux下,在命令行鍵入:

  1. g++ luaadd.cpp -llua -ldl -o luaadd  

然后,鍵入下列命令運(yùn)行:

  1. ./luaadd 

如果沒(méi)有問(wèn)題, 程序?qū)@示結(jié)果為: "The sum is 25"。

在Visual C++你將需要進(jìn)行下列步驟:

創(chuàng)建一個(gè)新的空Win32控制臺(tái)應(yīng)用工程。

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

選擇項(xiàng)目菜單中的屬性菜單。

在"連接器"的"輸入"欄目的"附加依賴(lài)項(xiàng)"中輸入"lua5.1.lib"。

確定。

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

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

全局變量

全局變量在Lua中也很好處理。就像我們看到的,lua_getglobal()將一個(gè)Lua全局變量壓入棧中。例如,在Lua腳本中包含一個(gè)全局變量z,下面代碼的功能就是得到它的值:

  1. lua_getglobal(L, "z");z = (int)lua_tointeger(L, -1);lua_pop(L, 1);  

相應(yīng)地,lua_setglobal()函數(shù)能夠設(shè)置全局變量地值。下面這段代碼演示了如何將Lua全局變量z的值變?yōu)?0:

  1. lua_pushnumber(L, 10);lua_setglobal(L, "z");  

應(yīng)該記住:在Lua中,我們沒(méi)有必要顯式定義一個(gè)全局變量。如果全局變量不存在,調(diào)用lua_setglobal()將為你創(chuàng)建一個(gè)。

小結(jié):解析調(diào)用Lua函數(shù)使用方法的內(nèi)容介紹完了,希望通過(guò)本文的學(xué)習(xí)能對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-08-23 09:44:28

LUA腳本

2010-10-08 14:27:25

JavascriptSplit

2011-06-14 10:18:58

QThread Qt 線程

2009-11-24 16:18:14

PHP5析構(gòu)函數(shù)

2010-08-09 10:16:01

FlexBuilder

2011-06-30 16:53:18

QT Creator TableWidge

2009-12-07 16:52:59

PHP函數(shù)getima

2009-11-16 16:54:00

PHP構(gòu)造函數(shù)

2009-11-30 17:43:54

PHP split()

2011-08-25 16:47:53

LuaC++ 證書(shū)

2009-11-25 10:02:27

PHP會(huì)話Sessio

2013-06-08 17:09:35

Android開(kāi)發(fā)移動(dòng)開(kāi)發(fā)XML解析

2024-07-11 14:05:28

JavaScript函數(shù)

2024-09-03 13:32:11

JavaScriptEval函數(shù)

2009-08-28 17:01:43

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

2009-11-16 15:40:58

PHP數(shù)組函數(shù)

2009-11-26 19:05:04

PHP函數(shù)explod

2011-07-12 17:18:23

PHPstrtotime

2009-11-26 15:23:24

PHP函數(shù)ereg()

2021-07-16 07:57:35

JavaScriptEval函數(shù)
點(diǎn)贊
收藏

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