成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

通過例子學習Lua(6)—C/C++中用Lua函數

開發 前端
偶們這次主要說說怎么由Lua定義函數, 然后在C或者C++中調用. 這里偶們暫不涉及C++的對象問題, 只討論調用函數的參數, 返回值和全局變量的使用。

1.簡介

偶們這次主要說說怎么由Lua定義函數, 然后在C或者C++中調用. 這里偶們暫不涉及C++的對象問題, 只討論調用函數的參數, 返回值和全局變量的使用.

2.

這里偶們在e12.lua里先定義一個簡單的add(), x,y為加法的兩個參數,return 直接返回相加后的結果.

例e12.lua

  1. -- add two numbers   
  2. function add ( x, y )   
  3. return x + y   end 

在前一次里, 偶們說到 lua_dofile() 可以直接在C中執行lua文件. 因為偶們這個程序里只定義了一個add()函數, 所以程序執行后并不直接結果, 效果相當于在C中定義了一個函數一樣.

  Lua的函數可以有多個參數, 也可以有多個返回值, 這都是由棧(stack)實現的.需要調用一個函數時, 就把這個函數壓入棧, 然后順序壓入所有參數, 然后用lua_call()調用這個函數. 函數返回后, 返回值也是存放在棧中. 這個過程和匯編執行函數調用的過程是一樣的.

  例e13.cpp 是一個調用上面的Lua函數的例子

  1. #include 
  2.   extern "C" { // 這是個C++程序, 所以要extern "C", 
  3.   // 因為lua的頭文件都是C格式的 
  4.  
  5.   #include "lua.h" 
  6.   #include "lualib.h" 
  7.   #include "lauxlib.h" 
  8.   } 
  9.   /* the Lua interpreter */ 
  10.   lua_State* L; 
  11.   int luaadd ( int x, int y ) 
  12.   { 
  13.   int sum; 
  14.   /* the function name */ 
  15.   lua_getglobal(L, "add"); 
  16.   /* the first argument */ 
  17.   lua_pushnumber(L, x); 
  18.   /* the second argument */ 
  19.   lua_pushnumber(L, y); 
  20.   /* call the function with 2 
  21.   arguments, return 1 result */ 
  22.   lua_call(L, 2, 1); 
  23.   /* get the result */ 
  24.   sum = (int)lua_tonumber(L, -1); 
  25.   lua_pop(L, 1); 
  26.   return sum; 
  27.   } 
  28.   int main ( int argc, char *argv[] ) 
  29.   { 
  30.   int sum; 
  31.   /* initialize Lua */ 
  32.   L = lua_open(); 
  33.   /* load Lua base libraries */ 
  34.   lua_baselibopen(L); 
  35.   /* load the script */ 
  36.   lua_dofile(L, "e12.lua"); 
  37.   /* call the add function */ 
  38.   sum = luaadd( 10, 15 ); 
  39.   /* print the result */ 
  40.   printf( "The sum is %d\n", sum ); 
  41.   /* cleanup Lua */ 
  42.   lua_close(L); 
  43.   return 0; 
  44.   } 

程序說明:

main中過程偶們上次已經說過了, 所以這次只說說luaadd的過程

* 首先用lua_getglobal()把add函數壓棧

* 然后用lua_pushnumber()依次把x,y壓棧

* 然后調用lua_call(), 并且告訴程序偶們有兩個參數一個返回值

* 接著偶們從棧頂取回返回值, 用lua_tonumber()

* ***偶們用lua_pop()把返回值清掉

運行結果:

The sum is 25

編譯方法

Linux下把程序存成e13.cpp

g++ e13.cpp -llua -llualib -o e13

./e13

VC下編譯方法

* 首先建立一個空的Win32 Console Application Project

* 把e13.cpp加入工程中

* 點project setting,然后設置link選項, 再加上lua.lib lualib.lib兩個額外的庫

* ***編譯

建立好的project可以在這里下載

VC http://tonyandpaige.com/tutorials/luaadd.zip

Linux http://tonyandpaige.com/tutorials/luaadd.tar.gz

3.全局變量

上面偶們用到了lua_getglobal()但并沒有詳細講, 這里偶們再舉兩個小例子來說下全局變量

lua_getglobal()的作用就是把lua中全局變量的值壓入棧

lua_getglobal(L, "z");

z = (int)lua_tonumber(L, 1);

lua_pop(L, 1);

假設Lua程序中定義了一個全局變量z, 這段小程序就是把z的值取出放入C的變量z中.

另外Lua中還有一個對應的函數lua_setglobal(), 作用是用棧頂的值填充指定的全局變量

lua_pushnumber(L, 10);

lua_setglobal(L, "z");

例如這段小程序就是把lua中的全局變量z設為10, 如果lua中未定義z的話, 就會自動創建一個

全局變量z并設為10.

4.試試看

自己寫個函數用C/C++來調用下試

原文鏈接:http://tech.it168.com/j/2008-02-14/200802141408319.shtml

責任編輯:陳四芳 來源: 來自ITPUB論壇
相關推薦

2013-12-13 16:46:18

Lua腳本語言

2011-08-23 16:59:16

C++LUA腳本LUA API

2013-12-13 15:54:32

Lua腳本語言

2013-12-13 15:42:32

Lua腳本語言

2013-12-13 15:48:52

Lua腳本語言

2011-08-22 17:25:31

LuaC++函數

2013-12-12 17:30:03

Lua例子

2011-08-22 17:13:00

LuaC++函數

2011-08-25 16:47:53

LuaC++ 證書

2011-09-06 17:12:25

Lua腳本C++封裝庫

2014-09-19 10:46:36

LuaCC++

2011-08-24 10:32:03

LuaPlusC++Lua

2010-01-14 17:42:47

CC++

2010-02-05 15:59:26

C++函數重載

2011-08-29 16:48:50

Lua配置文件C++

2011-08-24 13:27:07

Lua 游戲C接口腳本

2013-12-13 17:33:22

Lua對象管理

2011-08-25 15:35:18

Lua游戲對象

2011-08-23 11:13:56

Lua

2021-01-12 06:42:50

Lua腳本語言編程語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品欧美一区二区三区 | av一二三区| 三级黄色片在线 | 日韩欧美在线一区 | 波多野结衣一区二区三区 | 国产激情一区二区三区 | 国产精品亚洲成在人线 | 国产精品久久久久久久免费观看 | 国产激情视频网 | 亚洲成年在线 | 午夜视频在线 | 欧美一区二区三区四区五区无卡码 | 91久久精品日日躁夜夜躁国产 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 国产欧美久久精品 | 一区二区三区中文字幕 | 国产亚洲精品久久久久久豆腐 | 九九热国产精品视频 | 国产精品久久久久久52avav | 97国产精品视频人人做人人爱 | 久久亚洲国产精品 | 成人免费视频网站在线观看 | 日韩毛片免费看 | 国产精品二区三区在线观看 | 国产精品久久久久久久久久久久久久 | 91网站在线看 | 91极品视频| 久久精品一区二区 | 野狼在线社区2017入口 | 亚洲高清一区二区三区 | 久久久一二三 | 一区二区国产精品 | 国产一区高清 | 日韩精品在线观看视频 | 精品视频久久久 | 久草成人 | 国产黄色一级片 | 羞羞视频网站免费看 | 欧美xxxⅹ性欧美大片 | 找个黄色片 | 国产一区二区在线播放视频 |